2015-10-16 27 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