2012-02-22 12 views
9

スペース、アンパサンドなどのさまざまな文字を持つWebサーバー(人物をアップロードする)には、奇妙なドキュメント名が格納されます。これらのドキュメントへのリンクを生成するときには、サーバーからエスケープする必要があります。ファイルを生の名前でデータベースに格納します。ただし、組み込みの.NETエスケープ関数は、すべての場合に正しく動作しません。.NETでどのようにドキュメント名を正しくエスケープしますか?

文書Hello#There.docxください:しかし、正しくUrlEncodeますないハンドルHello There.docx

HttpUtility.UrlEncode("Hello#There"); 
"Hello%23There" 

を::

HttpUtility.UrlEncode("Hello There.docx"); 
"Hello+There.docx" 

+シンボルにのみ有効です

UrlEncodeはこれを正しく処理されますがURLパラメータではなく、dドキュメント名。面白いことに、これは実際にVisual StudioテストWebサーバーでは動作しますが、IISでは動作しません。

UrlPathEncode機能は、スペースのため正常に動作します:

HttpUtility.UrlPathEncode("Hello There.docx"); 
"Hello%20There.docx" 

しかし、そのような#文字として他の文字をエスケープしません。

HttpUtility.UrlPathEncode("Hello#There.docx"); 
"Hello#There.docx" 

#は次のように解釈されるように、このリンクは無効です。 URLハッシュはサーバーに到達しません。

文書名に英数字以外のすべての文字をエスケープする.NETユーティリティーメソッドがありますか、それとも独自に記述する必要がありますか?

+1

ユーザーが同じ名前のファイルをアップロードすると、dupsはどのように処理されますか? (例えばguidのような)名前を機械で生成し、親しみやすいユーザ提供の名前を(生成されたファイル名と共に)データベースに格納する方が簡単ではないでしょうか? –

+0

あなたはおそらく、[1] [パスとファイル名からの不正な文字を削除]このような何かを必要とする[1]:http://stackoverflow.com/questions/146134/how-to-remove-illegal-characters -from-path-and-filenames –

+0

@KirkWoll - 良い質問:) URL *は実際には '/ Docs/12345/My File.docx'のように見えます - 12345はユニークなキーですが、IEの" Save As "ダイアログで、最初にアップロードしたのと同じ名前のファイルを保存します。私たちはまた、ファイル名がキーと一致することを確認して、人々がランダムな文書を推測するのを防ぐ(そうではなく、100%安全ですが十分に良い)。 –

答えて

14

Uri.EscapeDataString Methodを見てください:

Uri.EscapeDataString("Hello There.docx") // "Hello%20There.docx" 

Uri.EscapeDataString("Hello#There.docx") // "Hello%23There.docx" 
+1

あなたは紳士で学者です。 –

+0

外部の文字がある場合、これはUTF8のエスケープされた表現として変換します。その場合、ファイルを開くアプリケーションによって面白いファイル名が得られる可能性があります。例えば ​​"Hélo.docx"(ブラウザで正しく表示されている)のように、 "H%C3%A9lo.docx"になります。しかし、これは十分であるかもしれません(そして、これはUrlEncodeと同じですが)。しかし、「ユーザーフレンドリー」が強い要件である場合は、同様にチェックすることをお勧めします。 –

+0

+1しかし、 'UrlEncode'と' UrlPathEncode'と 'EscapeDataString'を使うときの簡単な書式を書くことができますか? –

6

私はそれを別の方法でアプローチします:あなたのルックアップでキーとして文書名を使用しないでください - GUIDまたは他のいくつかのidパラメータを使用しますデータベースのディスクの文書名にマップすることができます。それは一意性を保証するだけでなく、最初にこのエスケープの問題を抱えていないでしょう。

+0

優秀な点、私は上記の私のコメントでその問題に取り組んだ。 –

+2

あなたの応答に 'content-disposition' HTTPヘッダーを使用できないのはなぜですか?これでファイル名は – BrokenGlass

0

@文字を使用して文字列をエスケープできます。以下のコードを参照してください。

string str = @"\n\n\n\n"; 
Console.WriteLine(str); 

出力:\ N \ N \ N \ N

string str1 = @"\df\%%^\^\)\t%%"; 
Console.WriteLine(str1); 

出力:\ DF \ %%^\ ^)\ T %%

フォーマットのこの種のは非常に便利ですパス名と正規表現の作成に使用します。

+2

に設定できます。これは、アプリケーションではなくC#パーサーと関係があります。 – BoltClock

関連する問題