2011-12-19 16 views
1

手元にある問題:次のコードは時々System.ArgumentException: Illegal characters in pathをスローします。アップロードされたファイルの名前を扱う正しい方法

ファイルはさまざまなエンドユーザーによってアップロードされるため、このケースは無効であると見なして無視できません。失敗したアップロード要求の

UserAgent文字列は、通常のMacシステムで指し示します。そして、違法な性格(私が調査して気にかけた場合)は、0-32の範囲内のいくつかの制御文字だった。

GetFileName()コールが必要な場合があります。HttpPostedFile.FileNameには、ファイルの名前だけでなく、場合によってはユーザーのマシン上のフルパスが含まれていることがあります。

var fileName = Request.Files[0].FileName; 
foreach (var c in Path.GetInvalidPathChars()) 
    fileName = fileName.Replace(c, '_'); 
fileName = Path.GetFileName(fileName); 

のような何かをすることができましたが、それはちょうどいい気分ではありません。

アップロードされたファイル名を扱う標準の「ウェブ」方法はありませんか?私はこの問題に最初に遭遇したことを受け入れるのに苦労します。

============================================== ====================

さらなる混乱を避けるためです。抽出されたファイル名は、ではなく、ディスクにファイルを格納するために使用され、ホスト環境のコンテキストで有効である必要はありません。ユーザーに表示するだけで済みます。

+0

標準的な方法は、他のユーザーがアップロードしたファイルと競合しないファイル名をサーバに生成することです。 – dtb

+0

通常は標準ではありませんが、私は何が推奨されているのか、何がないのかを言うでしょう。たとえば1,2,3などの名前を持つ名前を始めることも考えておいてください。ファイルの名前の扱いについては、ファイルが処理できるものと処理できないものを知っておく必要があります。検証クラスを作成し、 '、@、 #、$、%、^、&、*、(、)、+、=、{、}、[、]あなたは考えを得ます..有効でない文字や文字列を作成し、 "_ - 'と最初の文字の後の数字...上に書いたものは大丈夫ですが、' _ 'のみをチェックしています。他のすべての命名規則は – MethodMan

+0

@dtbになります。ファイルはディスク上に ' Guid.NewGuid()。ToString( "n") '。それでも私は何らかの理由で解析する必要がある元の名前をユーザに提示する必要があります。 –

答えて

1

文字を置き換えるだけでは安全ではありません。ファイル名を検証し、サポートされていないときに修正するようにユーザーに指示する必要があります(これは完全に正当です。ファイル名に制限があります)。 は、そうでなければ、することができます:あなたが言ったように

  1. は、サポートされていない文字を置き換える(ただし、あなたが可能なすべての無効な文字を置き換えることを確認することができますか?)
  2. エンコードファイル名
+0

実行可能な回避策のように見えません...私はそれらに何を伝えますか?パス名から文字コードXを削除してください。 –

1

あなただけしたい場合はユーザーが提出したファイル名を表示し、有効なファイル名が必要ではない場合は、末尾の\または\文字まで任意の文字を取り除くことができます。

string result = name.Substring(name.LastIndexOfAny(new[] { '/', '\\' }) + 1); 

LastIndexOfAny -1を返し、元の文字列が、この場合に返されるので、\は、発見されていない/または場合。)

、それをユーザーに表示するときにHTMLエンコードファイル名に忘れてはいけません。

+0

+1これは実行可能ですが、不完全です。 –

-1

通常、DateTime.Now.Ticksをファイル名の先頭またはユーザーID(およびティック)に追加すると、その詳細に基づいてファイルを処理/移動できます。

問題の原因となっている文字は、可能性がありますか? (私は、Windowsがファイル名の先頭に。。をうまく扱っているか確信していません。

関連する問題