2011-10-17 27 views
6

新しいasp.net 4.5非同期ハンドラと、Request.GetBufferlessInputStreamを使ってディスクに画像をアップロードする方法を工夫しています。このコードは実行され、ファイルを書き出しますが、画像が壊れていて、なぜその理由がわかりません。ここでは、私が使用しているコードは.NET 4.5 HttpTaskAsyncHandlerファイルをアップロードする

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

それはどのように破損していますか? – Amy

+0

上記に加えて、大きなテキストファイルで試してください。その方法で結果にアクセスできますが、ファイルに何が起こっているかを見ることができます。 – stevenrcfox

+0

私は実際のリクエストを解析し、フォーム/マルチパートデータを探しなければならないと思っていますか? – superlogical

答えて

0

私は1つのことに気付いた。あなたのResponse.ContentType = image/gifは、ストリームは通常のストリームの代わりにBinaryStreamでなければならないのですか?

+0

Response.ContentTypeはtext/plainである必要があります。これは、ブラウザへの応答として非同期的に "Done"を記述しているためです。 – superlogical

関連する問題