2016-08-18 26 views
1

FormData APIを使用してアップロードしているウェブサイトにcanvasという要素があります。ここで私はそれを行う方法は次のとおりです。私はthis postごとに全体data:image/jpeg;base64,ビジネスを交換していReadAsMultipartAsyncは実際にどのように機能しますか?

upload: function (e) { 
    var file = this.imagePreview.ui.canvas.get(0).toDataURL("image/jpeg") 
        .replace('data:image/jpeg;base64,', ''); 
    if (file) { 
     var formData = new FormData(); 
     formData.append('file', file); 
     $.ajax({ 
      url: app.getApiRoot + 'UserFiles/', 
      type: "post", 
      data: formData, 
      processData: false, 
      contentType: false, 
      error: function() { 
       $("#file_upload_result").html('there was an error while submitting'); 
      } 
     }); 
    } 
} 

。私は、次のマルチコントローラを有するバックエンドで

私は次のように CustomMultipartFormDataStreamProviderを実装
public async Task<IHttpActionResult> PostUserFile() 
{ 
    string imageDir = ConfigurationManager.AppSettings["UploadedImageDir"]; 
    var PATH = HttpContext.Current.Server.MapPath("~/" + imageDir); 
    var rootUrl = Request.RequestUri.AbsoluteUri.Replace(Request.RequestUri.AbsolutePath, String.Empty); 

    if (Request.Content.IsMimeMultipartContent()) 
    { 
     var streamProvider = new CustomMultipartFormDataStreamProvider(PATH); 
     await Request.Content.ReadAsMultipartAsync(streamProvider).ContinueWith(t => 
     { 
      if (t.IsFaulted || t.IsCanceled) 
      { 
       throw new HttpResponseException(HttpStatusCode.InternalServerError); 
      } 

      var files = streamProvider.FileData.Select(i => 
         { 
          var info = new FileInfo(i.LocalFileName); 
          return new UserFile(User.Identity.GetUserId(), info.Name, rootUrl + "/" + imageDir + "/" + info.Name, info.Length/1024); 
         }); 

      db.UserFiles.AddRange(files); 
      db.SaveChangesAsync(); 
     }); 

     return Ok(); 
    } 
    else 
    { 
     throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotAcceptable, "This request is not properly formatted")); 
    } 
} 

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

    public override string GetLocalFileName(Headers.HttpContentHeaders headers) 
    { 
     var name = !string.IsNullOrWhiteSpace(headers.ContentDisposition.FileName) ? 
         headers.ContentDisposition.FileName : 
         "NoName"; 
     // This is here because Chrome submits files in quotation 
     // marks which get treated as part of the filename and get escaped 
     return name.Replace("\"\"", string.Empty); 
    } 
} 

を悲しい、ReadAsMultipartAsync方法にstreamProvider摂食にFileDataが空であります:

FileData count = 0

そして、私はウォッチウィンドウから気づくように私が面白いと別のものは、アップロードされたバイナリファイルがエスケープされていることである。

Escaped data

%2f/文字のエスケープシーケンスです。

私は単純にできません問題を特定します。誰でも何か提案がありますか?

答えて

0

ContinueWithとasync/awaitを混ぜると、問題が発生します。await Request.Content.ReadAsMultipartAsync(streamProvider);を実行し、.ContinueWithのすべてが通常のコードのように待っています。

または削除非同期/待つと追加:Sending HTML Form Data in ASP.NET Web API: File Upload and Multipart MIME

+0

、より詳細に答えを教えてください:

return Request.Content.ReadAsMultipartAsync(streamProvider).Continu‌​eWith... 

はまた、あなたがこのリンクを見ることができます。 –

+0

Stackoverflowの使い方を学んでみてください。答えを編集し、コメントに情報を追加しないでください。これを読む:https://stackoverflow.com/help/how-to-answer –

+0

非常に妥当な音です。私は今日後でそれを実装して、あなたにお返ししましょう。 – seebiscuit

関連する問題