将多部分内存流读入文件

时间:2018-07-17 12:59:34

标签: c# file multipart

我有一个尝试中的插件的示例代码。

 HttpResponseMessage hrm = client.PostAsync(uri, content).GetAwaiter().GetResult();
 if (hrm.StatusCode == HttpStatusCode.OK)
 {
     MultipartMemoryStreamProvider provider = hrm.Content.ReadAsMultipartAsync().GetAwaiter().GetResult();
     if (provider.Contents.Count > 0)
     {
        for (int i = 0; i < provider.Contents.Count; i++)
        {
           HttpContent rcontent = provider.Contents[i];
           byte[] bytes = rcontent.ReadAsByteArrayAsync().GetAwaiter().GetResult();

           File.WriteAllBytes(@"c:\temp\ConvertToPDF" + i + ".pdf", bytes);
         }
      }
 }

此代码将n个文件发布到api,并以pdf格式获取相同的文件作为响应。

然后将响应保存到其他文件中。目前,MultipartMemoryStreamProviderContents集合中有n个文件。但是,这两个文件实际上都指向我选择的最后一个文件。

创建请求的代码

 //Multipart content
 MultipartContent content = new MultipartContent();

 foreach (var singleFile in files)
 {
    //Create the StreamContent of the input file and add to the MultpartContent
    StreamContent is1 = new StreamContent(singleFile.InputStream);
    is1.Headers.ContentType = new MediaTypeHeaderValue(singleFile.ContentType);
    is1.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
    is1.Headers.ContentDisposition.Name = singleFile.FileName;
    is1.Headers.ContentDisposition.FileName = singleFile.FileName;
    content.Add(is1);
 }

这是创建内容对象的代码。我检查了该对象,它实际上包含两个不同的文件。所以,我不确定为什么下面这行会引起问题。

MultipartMemoryStreamProvider provider = hrm.Content.ReadAsMultipartAsync().GetAwaiter().GetResult();

P.S。插件名称为ActivePDF DocConverter。遗憾的是,它不提供托管的演示链接,因此我无法在此处提供网址。我正在使用本地计算机托管该插件。

1 个答案:

答案 0 :(得分:0)

好的,所以我知道了。原来,转换工具在返回转换后的文件时正在对文件名进行替换。因此,test.xls和test.doc都可以正确转换,但是两者的新文件名为test.pdf。显然,插件未考虑文件名可以相同的事实。 因此,默认情况下,我决定在文件名中添加一个计数器。下面是更新的代码。

foreach (var singleFile in files)
{
   //Create the StreamContent of the input file and add to the MultpartContent
   StreamContent is1 = new StreamContent(singleFile.InputStream);
   is1.Headers.ContentType = new MediaTypeHeaderValue(singleFile.ContentType);
   is1.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
   is1.Headers.ContentDisposition.Name = singleFile.FileName;
   is1.Headers.ContentDisposition.FileName = x + singleFile.FileName;
   content.Add(is1);
   x++;
}

x只是一个整数变量。我知道它很脏,但是除了要求插件团队修复其代码外,这似乎是唯一的解决方案。

相关问题