2015-10-16 24 views
3

下面的代碼片段成功HttpPosts單個文件到WebAPI。我想要擴展它來構建包含多個文件的StreamContent(類似於Fiddler多文件帖子)。POST StreamContent與多個文件

我知道我應該爲StreamContent添加一個「邊界」,但我不確定在哪裏。我想最終將FileStream/Stream參數轉換爲List,以便我可以遍歷集合並將StreamContent構建爲POST。

讓我知道這篇文章是否有意義。我會很感激任何建議。

在此先感謝!

public async Task<HttpStatusCode> UploadOrderFile(FileStream imageFileStream, string filename, string contentType = "image/png") 
    { 
     JsonApiClient._client.DefaultRequestHeaders.Clear(); 
     var content = new MultipartFormDataContent 
     { 
      JsonApiClient.CreateFileContent(imageFileStream, filename, contentType) 
     }; 
     JsonApiClient._client.DefaultRequestHeaders.Add("Authorization", 
      " Bearer " + JsonApiClient.Token.AccessToken); 
     var response = await JsonApiClient._client.PostAsync("api/UploadFile", content); 

     response.EnsureSuccessStatusCode(); 
     return response.StatusCode; 
    } 

internal static StreamContent CreateFileContent(Stream stream, string fileName, string contentType) 
    { 
     var fileContent = new StreamContent(stream); 
     fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data") 
     { 
      Name = "\"files\"", 
      FileName = "\"" + fileName + "\"" 
     }; 
     fileContent.Headers.ContentType = new MediaTypeHeaderValue(contentType); 
     return fileContent; 
    } 

編輯:我沒有任何問題,接收和保存的文件發佈。問題在於創建發佈多個文件所必需的StreamContent。

回答

2

這是我想爲我的作品的解決方案。 CreateFileContent中沒有任何更改。我只是簡單地將參數轉換爲集合,遍歷每個集合,並從多個StreamContent中添加新的MultiPartFormDataContent。邊界也被添加到MultipartFormDataContent對象中。如果您發現任何效率低下或明顯錯誤的事情,請告訴我。謝謝!

public async Task<HttpStatusCode> UploadOrderFile(List<FileStream> imageFileStream, List<string> filename, string salesOrderNo, List<string> contentType) 
    { 
     JsonApiClient._client.DefaultRequestHeaders.Clear(); 
     var boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x", NumberFormatInfo.InvariantInfo); 
     var content = new MultipartFormDataContent(boundary); 
     for (var i = 0; i < imageFileStream.Count; i++) 
     { 
      content.Add(JsonApiClient.CreateFileContent(imageFileStream[i], filename[i], contentType[i])); 
     } 

     JsonApiClient._client.DefaultRequestHeaders.Add("Authorization", 
      " Bearer " + JsonApiClient.Token.AccessToken); 
     var response = await JsonApiClient._client.PostAsync("api/UploadFile", content); 

     response.EnsureSuccessStatusCode(); 
     return response.StatusCode; 
    } 

internal static StreamContent CreateFileContent(Stream stream, string fileName, string contentType) 
{ 
    var fileContent = new StreamContent(stream); 
    fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data") 
    { 
     Name = "\"files\"", 
     FileName = "\"" + fileName + "\"" 
    }; 
    fileContent.Headers.ContentType = new MediaTypeHeaderValue(contentType); 
    return fileContent; 
} 
1

試試這個辦法

 public HttpResponseMessage Post() 
     { 
      var httpRequest = HttpContext.Current.Request; 
      if (httpRequest.Files.Count > 0) 
      { 
       foreach(string file in httpRequest.Files) 
       {     
var content = new MultipartFormDataContent 
     { 
      JsonApiClient.CreateFileContent(postedFile.InputStream, postedFile.FileName, postedFile.ContentType) 
     }; 
       // NOTE: To store in memory use postedFile.InputStream 
       } 

       return Request.CreateResponse(HttpStatusCode.Created); 
      } 

      return Request.CreateResponse(HttpStatusCode.BadRequest); 
     } 


    internal static StreamContent CreateFileContent(Stream stream, string fileName, string contentType) 
     { 
      var fileContent = new StreamContent(stream); 
      fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data") 
      { 
       Name = "\"files\"", 
       FileName = "\"" + fileName + "\"" 
      }; 
      fileContent.Headers.ContentType = new MediaTypeHeaderValue(contentType); 
      return fileContent; 
     } 
+0

謝謝你的迴應。我在上面發佈的代碼不會在WebAPI中發生。它發佈到WebAPI進行保存。我沒有問題接收多個文件;問題在於發佈多個文件。如您所見,我可以創建包含單個文件的StreamContent,但如果可能的話,我希望它包含多個文件。 – terbubbs

+0

我編輯了我的答案,包括每個發佈文件的流。 –

+0

是的,我注意到了。但是,就像我在之前的評論中所說的,我沒有任何問題接收和保存發佈的文件。問題在於創建發佈多個文件所必需的StreamContent。 – terbubbs