2013-05-28 13 views
8

Obecnie mogę zapisać plik przesyłany do kontrolera WebAPI, ale chcę mieć możliwość zapisania pliku jako identyfikatora z poprawnym rozszerzeniem nazwy pliku więc można go wyświetlać poprawnie.Przesyłanie pliku ASP.NET WebApi przy użyciu kreatora i rozszerzenia pliku

Kod:

[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; 
    } 

I nie może wydawać się uzyskać uchwyt na rzeczywistej nazwy pliku zawartości. Myślałem, że headers.ContentDisposition.FileName może być kandydatem, ale nie wydaje się być wypełnione.

+0

Oto podobne pytanie z odpowiedzią [http://stackoverflow.com/questions/14937926/file-name-from-httprequestmessage-content][1] [1]: http://stackoverflow.com/questions/14937926/file-name-from-httprequestmessage-content – forseta

+0

Czy możesz udostępnić jak wyglądają nagłówki Twojego zapytania? Czy w żądaniu znajduje się nagłówek ContentDisposition? –

+0

Obowiązkiem klienta jest ustawienie takich nagłówków. Jak wygląda Twój klient? – Snixtor

Odpowiedz

18

Dzięki za powyższe komentarze, które wskazały mi właściwy kierunek.

Aby wyjaśnić ostateczne rozwiązanie, użyłem MultipartFormDataStreamProvider, który automatycznie przesyła plik. Kod znajduje się w innym pytaniu, które zamieściłem pod innym problemem: MultipartFormDataStreamProvider and preserving current HttpContext

Mój pełny kod dostawcy jest wymieniony poniżej. Kluczem do wygenerowania nazwy pliku guid jest zastąpienie funkcji GetLocalFileName i użycie właściwości headers.ContentDisposition. Dostawca obsługuje przesyłanie strumieniowe zawartości do pliku.

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

Zgłasza wyjątek odwołania zerowego w 'var filename = headers.ContentDisposition.FileName.Replace (" \ "", string.Empty);. "Naprawiono przez sprawdzenie, czy' nazwapliku' nie ma wartości NULL przed wykonaniem 'Zamień()'. –

+0

Dlaczego aldo zastąpić metodę GetStream? –