2016-10-13 4 views
0

私は私のコントローラとファイル受諾していていHttpPostの一環として:を含むJSON添付

[HttpPost, Route("api/upload")] 
public async Task<IHttpActionResult> Upload() 
{ 
    if (!Request.Content.IsMimeMultipartContent()) 
     throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType); 

    var provider = new MultipartMemoryStreamProvider(); 
    await Request.Content.ReadAsMultipartAsync(provider); 
    foreach (var file in provider.Contents) 
    { 
     var filename = file.Headers.ContentDisposition.FileName.Trim('\"'); 
     var buffer = await file.ReadAsByteArrayAsync(); 
     //Do whatever you want with filename and its binaray data. 
    } 

    return Ok(); 
} 

をどのように私は、クライアントが、リクエストのボディにJSONを投稿できるようにすることができません?

+0

本文からのリクエストを受け入れるために '[FromBody]'を使用してください。 – inan

+0

これは郵便配達員でテストできません。 –

答えて

1
[Route("{lang}/documents")] 
    public async Task PostDocument() 
    { 
     string dirPath = _appConfigurationManager.GetDocumentFolder(); 
     if (!Directory.Exists(dirPath)) 
     { 
      DirectoryInfo createdir = Directory.CreateDirectory(dirPath); 
     } 

     if (Request.Content.IsMimeMultipartContent()) 
     { 
      if (Request.Content.ReadAsStringAsync().Result.ToString().IndexOf("filename=\"\"") == -1) 
      { 
       var streamProvider = new CustomMultipartFormDataStreamProvider(dirPath); 
       var result = await Request.Content.ReadAsMultipartAsync(streamProvider); 
       var fileEntity = new ViewModels.Common.FileDescViewModel(); 

       foreach (var file in result.FileData) 
       { 
        fileEntity.FileName = file.Headers.ContentDisposition.FileName.Replace("\"", string.Empty); 
        fileEntity.Url = "~/" + fileEntity.FileName;      
       } 

       var jsonmodel = result.FormData["jsonData"].ToString().Replace("\"content\":\"\",", string.Empty); 
       if (jsonmodel == null) 
        throw new Exception(); 

       var siteViewModel = JsonConvert.DeserializeObject<DocumentViewModel>(jsonmodel); 
       siteViewModel.Url = fileEntity.Url;     
       siteViewModel.Name = fileEntity.FileName; 
       AddDocumentDetails(siteViewModel); 
      } 
      else 
      { 
       string jsonData = Request.Content.ReadAsStringAsync().Result.Replace("\"content\":\"\",", string.Empty); 
       jsonData = jsonData.Substring(jsonData.IndexOf('{'), jsonData.LastIndexOf('}') - jsonData.IndexOf('{') + 1); 
       var siteViewModel = JsonConvert.DeserializeObject<DocumentViewModel>(jsonData); 
       AddDocumentDetails(siteViewModel); 
      } 
     } 
    } 

これは私の実際のテストコードです。それを試してくださいそれは間違いなく実行されます。

+0

私の評判はそれを許さないので、私はこれをマークすることができません非常にあなたに感謝しますが、私はそれを試してみましょう!なぜこれをタスクと定義していますか?正規の方法ではないのはなぜですか? –

+0

これをテストするために郵便番号を設定する方法もお勧めしますか? –

+0

AddDocumentの部分を非同期で処理したいので、私はTaskを使用しました。 –

関連する問題