【问题标题】:POST StreamContent with Multiple FilesPOST StreamContent 与多个文件
【发布时间】:2016-01-15 06:41:23
【问题描述】:

下面的代码 sn -p 成功地将单个文件 HttpPosts 到 WebAPI。我想扩展它以构建包含多个文件的 StreamContent(类似于 Fiddler 多文件帖子)。

我知道我应该为 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。

【问题讨论】:

    标签: c# json post asp.net-web-api


    【解决方案1】:

    这是我尝试过的适合我的解决方案。 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;
    }
    

    【讨论】:

      【解决方案2】:

      试试这个方法

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

      【讨论】:

      • 感谢您的回复。我上面发布的代码不会出现在 WebAPI 中。它正在发布到保存完成的 WebAPI。接收多个文件没有问题;问题在于发布多个文件。如您所见,我能够创建包含单个文件的 StreamContent,但如果可能的话,我希望它包含多个文件。
      • 我已经编辑了我的答案以包括每个发布文件的流。
      • 是的,我注意到了。但是,就像我在之前的评论中所说的那样,我在接收和保存发布的文件时没有任何问题。问题在于创建发布多个文件所需的 StreamContent。
      猜你喜欢
      • 1970-01-01
      • 2013-04-16
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      • 2018-07-13
      • 1970-01-01
      • 2019-12-23
      相关资源
      最近更新 更多