2017-09-20 11 views
0

角度UIでng-file-uploadからmultipart/form-data投稿を正しく読み込むのに問題があります。側。OWINパイプラインのweb api 2でmultipart/form-dataを受け取るにはどうすればいいですか?

私はそうのようなコールを開始しています:

Upload.upload({ 
       url: config.ApiUrl + 'Orders/CreateOrder', 
       data: request 
      }).then(function (response) { 
       console.log('Success ' + response.config.data.file.name + 'uploaded. Response: ' + response.data); 
      }, function (error) { 
       $scope.errors = "Oops! Something went wrong... " + error.statusText; 
      }); 

そして、これは私のウェブAPIに送信するためのペイロードを取得します。

-----------------------------9623122368016 
Content-Disposition: form-data; name="somefield" 

Some Value 
-----------------------------9623122368016 
Content-Disposition: form-data; name="errorMessage" 

null 
-----------------------------9623122368016 
Content-Disposition: form-data; name="success" 

false 
-----------------------------9623122368016 
Content-Disposition: form-data; name="file"; filename="imapdf.pdf" 
Content-Type: application/pdf 

%PDF-1.2 
1 0 obj 
<< 
/Producer() 
/Author() 
/Title() 
/Subject() 
/Keywords() 
/CreationDate(D:20040106) 
/ModDate(D:20040106) 
/Creator() 
>> 
endobj 
2 0 obj 
<< 
/Type/XObject 
/Subtype/Image 
/Name/wpt1 
/Width 41 
/Height 15 
/BitsPerComponent 8 
/ColorSpace/DeviceRGB 
/Length 100 
/Filter [/FlateDecode] >> 
stream 
xsqH0s 

私が使用しているので、私はHttpContext.Current.Request.FilesにアクセスすることはできませんOWINパイプライン、多くの運がないRequest.Content.ReadAsMultipartAsync

私のファイル&はどのようにしてウェブAPI 2の関連するフォームデータを受け取ることができますか?

C#コードの更新:

public Task<OrderRequest> CreateOrder(OrderRequest orderRequest) 
{ 
    try 
    { 
     var asdf = OwinHttpRequestMessageExtensions.GetOwinContext(Request); 
     if (!Request.Content.IsMimeMultipartContent("multipart/form-data")) 
     { 
      var provider = new MultipartMemoryStreamProvider(); 
      this.Request.Content.ReadAsMultipartAsync(provider); 

      var content = provider.Contents.First(); 
      var buffer = content.ReadAsByteArrayAsync(); 
     } 

     var test = orderRequest; 
     var a = HttpContext.Current.Request.Files; 
    } 
    catch (Exception ex) 
    { 
     throw ex; 
    } 

    return Task.FromResult<OrderRequest>(null); 
} 
+0

AngularJSコードがHTTPリクエストを適切に作成しているようです。問題のあるサーバー側のコードを表示してください。 – georgeawg

+0

@georgeawgはデータを取得するのに無駄な試みを投稿しました – RandomUs1r

+0

'Request.Content.ReadAsMultipartAsync'を使う必要があるようです。あなたが持っているコードを見せてくれますか? –

答えて

1

その名前が示唆するように、ReadAsMultipartAsync非同期機能です。呼び出しを待っていないため、データが入力される前にContentsにアクセスしようとしている可能性があります。次のように

これを修正するには、あなたのCreateOrderアクションを更新することができます。

public async Task<OrderRequest> CreateOrder(OrderRequest orderRequest) 
{ 
    ... 
    await this.Request.Content.ReadAsMultipartAsync(provider); 
    ... 
} 

すべてのことがここで変わったのはthis.Request.Content.ReadAsMultipartAsync(provider);Task<OrderRequest>awaitasyncを添加することです。同じ理由でをcontent.ReadAsByteArrayAsync();の前に追加すると、最後にTask.FromResultを使用する代わりにreturn nullにすることもできます。実際に

、ここではそれらの変更で全体のコードがあります:

明らか
public async Task<OrderRequest> CreateOrder(OrderRequest orderRequest) 
{ 
    try 
    { 
     var asdf = OwinHttpRequestMessageExtensions.GetOwinContext(Request); 
     if (!Request.Content.IsMimeMultipartContent("multipart/form-data")) 
     { 
      var provider = new MultipartMemoryStreamProvider(); 
      await this.Request.Content.ReadAsMultipartAsync(provider); 

      var content = provider.Contents.First(); 
      var buffer = await content.ReadAsByteArrayAsync(); 
     } 

     var test = orderRequest; 
     var a = HttpContext.Current.Request.Files; 
    } 
    catch (Exception ex) 
    { 
     throw ex; 
    } 

    return null; 
} 

、これは完全な解決策はありませんが、私はそれはあなたの特定の問題に対処し、あなたの探求を続けることができると確信しています。

+0

あなたの助けを借りて、感謝します! – RandomUs1r

関連する問題