2016-09-15 73 views
0

我想上传一个文件以及一些元数据到我用ng-file-upload和Angular创建的WebApi服务。我按照预期获取文件名和字节,但是我无法获取我传递的元数据。下面是我在做什么的角度侧上传CustomData与ng-file-upload和WebApi

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

而且的WebAPI侧

 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; 

这里我使用的是MultiStreamProvider获取文件,这里要说的是供应商的肉

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; 
}