2016-09-15 9 views
0

ng-file-uploadとAngularで作成したWebApiサービスに、メタデータとともにファイルをアップロードしようとしています。私は期待どおりのファイル名とバイトを取得していますが、私は同様に渡しているメタデータを取得することができません。ここで私は角側ng-file-uploadとWebApiを使用したCustomDataのアップロード

  Upload.upload({ 
       url: '/api/FileStorage/AddContent' + location.search, 
       data: {file: files, year: vm.year } 
      }) 

そして、私は、ファイルを取得するためにMultiStreamProviderを使用しています。ここ

 var streamProvider = new CustomMultipartFileStreamProvider(); 
       IEnumerable<HttpContent> parts = null; 
       Task.Factory 
        .StartNew(() => parts = Request.Content.ReadAsMultipartAsync(streamProvider).Result.Contents, 
         CancellationToken.None, 
         TaskCreationOptions.LongRunning, // guarantees separate thread 
         TaskScheduler.Default) 
        .Wait(); 

       var customData = streamProvider.CustomData; 

WEBAPI側でやっているものです、ここではそのプロバイダの肉がある

public override Task ExecutePostProcessingAsync() 
    { 
     foreach (var file in Contents) 
     { 
      var parameters = file.Headers.ContentDisposition.Parameters; 
      var filename = GetNameHeaderValue(parameters, "filename"); 
      var year = GetNameHeaderValue(parameters, "year"); 
     } 

     return base.ExecutePostProcessingAsync(); 
    } 

問題なくファイル名を取得できますが、今年は一度も入手できません。ここで私はあなたが見ることができるように

enter image description here

可変パラメータで探していますデバッガの値があり、名前が「名前」で、値は、私が期待したときに「年」の名前があることをあります「年」と値が「2016」になるか、または何かを渡すかどうかここで間違っていますが、Apiへの同じ呼び出しにメタデータを含めるにはどうすればよいですか?

答えて

0

ng-file-uploadとWebAPIで同様のアプローチを使用します。フォームデータから値を取得するには、GetNameHeaderValueを使用できませんでした。私たちはいくつかの手作業による解析をしなければならなかった。 http://conficient.wordpress.com/2013/07/22/async-file-uploads-with-mvc-webapi-and-bootstrap/に投稿されたものの修正版を使用して、動的にフォームを取得して強く型付けされたモデルにアンロードすることにしました。しかし、基本的には、ここではExecutePostProcessingAsync方法で何をするかです:

public override async Task ExecutePostProcessingAsync() 
{ 
    var formData = new FormCollection(); 
    for (int index = 0; index < Contents.Count; index++) 
    { 
    ContentDispositionHeaderValue contentDisposition = headers.ContentDisposition; 
    if (contentDisposition != null) 
    { 
     HttpContent formContent = Contents[index]; 
     string formFieldName = UnquoteToken(contentDisposition.Name) ?? String.Empty; 

     // Read the contents as string data and add to form data 
     string formFieldValue = await formContent.ReadAsStringAsync(); 
     formData.Add(formFieldName, formFieldValue); 
    } 

    //For your case 
    var filename = formData["filename"]; 
    var year = formData["year"]; 

これはUnquoteToken方法で、これは使用しています。

private static string UnquoteToken(string token) 
{ 
    if (String.IsNullOrWhiteSpace(token)) 
    { 
    return token; 
    } 

    if (token.StartsWith("\"", StringComparison.Ordinal) && token.EndsWith("\"", StringComparison.Ordinal) && token.Length > 1) 
    { 
    return token.Substring(1, token.Length - 2); 
    } 

    return token; 
} 
関連する問題