2016-09-15 2 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

변수 매개 변수에서 찾고 디버거에서 값이, 이름은 "이름"이고 값은 내가 기대하는 때 "해"이름이 될 것입니다 "year"이고 값이 "2016"이거나 내가 무엇을 전달하는지 알고 싶습니다. 내가 여기서 뭘 잘못하고 있고 Api와 동일한 호출에 메타 데이터를 포함시키는 방법은 무엇입니까?

답변

0

우리는 ng-file-upload 및 WebAPI와 유사한 접근법을 사용합니다. 양식 데이터에서 값을 가져 오려면 GetNameHeaderValue를 사용할 수 없습니다. 수동 파싱을 ​​몇 번해야했습니다. http://conficient.wordpress.com/2013/07/22/async-file-uploads-with-mvc-webapi-and-bootstrap/에 게시 된 내용의 수정 된 버전을 사용하여 동적으로 양식을 가져 와서 강력한 형식의 모델로 언로드했습니다. 이것은 UnquoteToken 방법이 사용됩니다

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"]; 

:

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; 
} 
을하지만 기본적으로, 여기가 ExecutePostProcessingAsync 방법에 그렇잖아
관련 문제