2013-05-28 41 views
8

現在、WebAPIコントローラにアップロードされているファイルを保存することができますが、正しいファイル名拡張子を持つGUIDとして保存することができますそれは正しく見ることができます。guidとファイル拡張子を使用したASP.NET WebApiファイルのアップロード

コード:

[ValidationFilter] 
    public HttpResponseMessage UploadFile([FromUri]string AdditionalInformation) 
    { 
     var task = this.Request.Content.ReadAsStreamAsync(); 
     task.Wait(); 

     using (var requestStream = task.Result) 
     { 
      try 
      { 
       // how can I get the file extension of the content and append this to the file path below? 

       using (var fileStream = File.Create(HttpContext.Current.Server.MapPath("~/" + Guid.NewGuid().ToString()))) 
       { 
        requestStream.CopyTo(fileStream); 
       } 
      } 
      catch (IOException) 
      {      
       throw new HttpResponseException(HttpStatusCode.InternalServerError); 
      } 
     } 

     HttpResponseMessage response = new HttpResponseMessage(); 
     response.StatusCode = HttpStatusCode.Created; 
     return response; 
    } 

私はコンテンツの実際のファイル名のハンドルを取得するように見えることはできません。私はのheaders.ContentDisposition.FileNameが候補になるかもしれないと思っていましたが、そのように見なされることはありません。

+0

答えと似た質問[http://stackoverflow.com/questions/14937926/file-name-from-httprequestmessage-content][1] である[1]: http://stackoverflow.com/questions/14937926/file-name-from-httprequestmessage-content – forseta

+0

リクエストのヘッダーの様子を共有できますか?リクエストにContentDispositionヘッダーが設定されていますか? –

+0

このようなヘッダーを設定するのはクライアントの責任です。あなたのクライアントはどのように見えますか? – Snixtor

答えて

18

私は正しい方向に私を指摘した上記のおかげで、ありがとう。

最後の解決方法を明確にするために、ファイルを自動的にストリームするMultipartFormDataStreamProviderを使用しました。このコードは別の問題です。別の問題に投稿しました: MultipartFormDataStreamProvider and preserving current HttpContext

完全なプロバイダーコードは以下のとおりです。 GUIDファイル名を生成するための鍵は、GetLocalFileName関数をオーバーライドし、headers.ContentDispositionプロパティを使用することです。プロバイダは、ファイルへのコンテンツのストリーミングを処理します。ここで

public class MyFormDataStreamProvider : MultipartFormDataStreamProvider 
{ 
    public MyFormDataStreamProvider (string path) 
     : base(path) 
    { } 

    public override Stream GetStream(HttpContent parent, HttpContentHeaders headers) 
    { 
     // restrict what images can be selected 
     var extensions = new[] { "png", "gif", "jpg" }; 
     var filename = headers.ContentDisposition.FileName.Replace("\"", string.Empty); 

     if (filename.IndexOf('.') < 0) 
      return Stream.Null; 

     var extension = filename.Split('.').Last(); 

     return extensions.Any(i => i.Equals(extension, StringComparison.InvariantCultureIgnoreCase)) 
        ? base.GetStream(parent, headers) 
        : Stream.Null; 

    } 

    public override string GetLocalFileName(System.Net.Http.Headers.HttpContentHeaders headers) 
    { 
     // override the filename which is stored by the provider (by default is bodypart_x) 
     string oldfileName = headers.ContentDisposition.FileName.Replace("\"", string.Empty); 
     string newFileName = Guid.NewGuid().ToString() + Path.GetExtension(oldfileName); 

     return newFileName;  
    } 
} 
+1

'ファイル名'がヌルでないかどうかチェックして、 'Replace()'を実行する前にチェックしていた問題を修正しました。 –

+0

なぜGetStreamメソッドをオーバーライドしましたか? –

関連する問題