手元にある問題:次のコードは時々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);
のような何かをすることができましたが、それはちょうどいい気分ではありません。
アップロードされたファイル名を扱う標準の「ウェブ」方法はありませんか?私はこの問題に最初に遭遇したことを受け入れるのに苦労します。
============================================== ====================
さらなる混乱を避けるためです。抽出されたファイル名は、ではなく、ディスクにファイルを格納するために使用され、ホスト環境のコンテキストで有効である必要はありません。ユーザーに表示するだけで済みます。
標準的な方法は、他のユーザーがアップロードしたファイルと競合しないファイル名をサーバに生成することです。 – dtb
通常は標準ではありませんが、私は何が推奨されているのか、何がないのかを言うでしょう。たとえば1,2,3などの名前を持つ名前を始めることも考えておいてください。ファイルの名前の扱いについては、ファイルが処理できるものと処理できないものを知っておく必要があります。検証クラスを作成し、 '、@、 #、$、%、^、&、*、(、)、+、=、{、}、[、]あなたは考えを得ます..有効でない文字や文字列を作成し、 "_ - 'と最初の文字の後の数字...上に書いたものは大丈夫ですが、' _ 'のみをチェックしています。他のすべての命名規則は – MethodMan
@dtbになります。ファイルはディスク上に ' Guid.NewGuid()。ToString( "n") '。それでも私は何らかの理由で解析する必要がある元の名前をユーザに提示する必要があります。 –