2011-10-17 24 views
6

Sto cercando di capire come utilizzare i nuovi gestori async di asp.net 4.5 e il Request.GetBufferlessInputStream per scrivere un caricamento di immagine sul disco. Questo codice viene eseguito e scrive un file ma l'immagine è corrotta e non sono sicuro del perché. Ecco il codice che sto usando.NET 4.5 HttpTaskAsyncHandler carica un file

public class UploadHandler : HttpTaskAsyncHandler 
{ 
    public override Task ProcessRequestAsync(HttpContext context) 
    { 
     // Gets a Stream object that can be used to read the 
     // incoming HTTP entity body, optionally disabling the 
     // request-length limit that is set in the MaxRequestLength property. 

     // This method provides an alternative to using the 
     // InputStream property. The InputStream property waits until the 
     // whole request has been received before it returns a Stream object. 
     // In contrast, the GetBufferlessInputStream method returns 
     // the Stream object immediately. 
     // You can use the method to begin processing the 
     // entity body before the complete contents of the 
     // body have been received. 
     // The entity body (or as much of it as you request and has 
     // been received) is returned only when you use the object that 
     // is returned by this method to read the stream, by calling 
     // methods such as the Read method. You use parameters of the 
     // Read method to specify how much of the entity body to read. 

     // This method can be useful if the request is uploading a 
     // large file and you want to begin accessing the file contents 
     // before the upload is finished. 
     // However, you should only use this method for scenarios where 
     // you want to take over all processing of the entity body. 
     // This means that you cannot use this method from an .aspx page, 
     // because by the time an .aspx page runs, the entity body 
     // has already been read. 

     using (Stream input = context.Request.GetBufferlessInputStream(true)) 
     using (var file = new FileStream("C:\\myfile.jpg", FileMode.Create, 
      FileAccess.Write, FileShare.Write)) 
     { 
      input.CopyTo(file); 
     } 

     context.Response.ContentType = "text/plain"; 
     return context.Response.Output.WriteAsync("Done"); 
    } 
} 
+1

Come è corrotto? – Amy

+0

Oltre a quanto sopra, provalo con un file di testo di grandi dimensioni. in questo modo il risultato sarà accessibile ma puoi vedere che cosa sta succedendo al file. – stevenrcfox

+0

Sto pensando che dovrò analizzare la richiesta effettiva e cercare i dati modulo/multipart? – superlogical

risposta

0

non provando veramente il tuo codice ho notato una cosa. Non dovrebbe anche il tuo Response.ContentType = image/gif il flusso dovrebbe essere un BinaryStream invece di un flusso normale dal momento che è un'immagine con cui stai lavorando ..?

+0

Response.ContentType deve essere text/plain perché sto scrivendo in modo asincrono la scrittura "Done" come risposta al browser. – superlogical