2013-05-28 13 views
8

Attualmente sono in grado di salvare un file da caricare su un controller WebAPI, ma mi piacerebbe poter salvare il file come guida con l'estensione corretta del nome file quindi può essere visualizzato correttamente.Caricamento file ASP.NET WebApi tramite guid ed estensione file

Codice:

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

io non riesco a ottenere una maniglia sul nome effettivo del contenuto. Ho pensato che headers.ContentDisposition.FileName potrebbe essere un candidato ma non sembra essere popolato.

+0

Ecco una domanda simile con una risposta [http://stackoverflow.com/questions/14937926/file-name-from-httprequestmessage-content][1] [1]: http://stackoverflow.com/questions/14937926/file-name-from-httprequestmessage-content – forseta

+0

Puoi condividere l'aspetto delle intestazioni della tua richiesta? hai l'intestazione ContentDisposition popolata nella richiesta? –

+0

È responsabilità del cliente impostare tali intestazioni. Com'è il tuo cliente? – Snixtor

risposta

18

Grazie per i commenti sopra che mi hanno indirizzato nella giusta direzione.

Per chiarire la soluzione finale, ho utilizzato un MultipartFormDataStreamProvider che esegue lo streaming automatico del file. Il codice è in un'altra domanda che ho postato a un altro problema qui: MultipartFormDataStreamProvider and preserving current HttpContext

Il mio codice fornitore completo è elencato di seguito. La chiave per generare il nome del file di guida è sovrascrivere la funzione GetLocalFileName e utilizzare la proprietà headers.ContentDisposition. Il provider gestisce lo streaming del contenuto su file.

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

Genera un'eccezione di riferimento null su 'var nomefile = headers.ContentDisposition.FileName.Replace (" \ "", string.Empty); '. Fisso controllando se' filename' non è null prima di fare un 'Replace()'. –

+0

Perché aldo ha sovrascritto il metodo GetStream? –

Problemi correlati