为了账号安全,请及时绑定邮箱和手机立即绑定

如何将 GZipStream 转换为 HttpContent?

如何将 GZipStream 转换为 HttpContent?

C#
慕雪6442864 2021-11-14 10:21:51
我编写了一个 Web API 代码来返回一个 zip 文件。但我无法将 GZipStream 内容转换为 HttpContent。我收到以下错误:无法将类型“system.io.compression.GZipStream”隐式转换为“System.Net.Http.HttpContent”我哪里做错了?我的 WebApi 代码:var content =     new GZipStream(memStream, CompressionMode.Compress);HttpResponseMessage httpResponseMessage = new HttpResponseMessage();httpResponseMessage.Content = content;httpResponseMessage.Content.Headers.Add("x-filename", document.FileName);httpResponseMessage.Content.Headers.ContentType = new MediaTypeHeaderValue("application/zip");httpResponseMessage.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");httpResponseMessage.Content.Headers.ContentDisposition.FileName = "xyz.zip";httpResponseMessage.StatusCode = HttpStatusCode.OK;
查看完整描述

2 回答

?
隔江千里

TA贡献1906条经验 获得超10个赞

我得到了一个使用 Zip 存档的解决方案,我创建了一个静态类来将内存流推送到一个 zip 存档中,如下所示,


 var pushStreamContent = ZipStreamContent.Create("MultipleDocument.zip", memStList);

ZipStreamContent 类,


public static class ZipStreamContent

{

    public static PushStreamContent Create(string fileName, List<MemoryStream> msList)

    {

            var content = new PushStreamContent((outputStream, httpContent, transportContext) =>

            {

                using (var zip = new ZipArchive(outputStream, ZipArchiveMode.Create, leaveOpen: false))

                {


                     msList[0].Position = 0;

                    var createenter = zip.CreateEntry("xyz.jpg", CompressionLevel.Optimal);

                    using (var s = createenter.Open())

                    {

                        msList[0].CopyTo(s);

                    }


                }


            });


        content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");

        content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");

        content.Headers.ContentDisposition.FileName = fileName;

        return content;

    }

}


查看完整回答
反对 回复 2021-11-14
?
九州编程

TA贡献1785条经验 获得超4个赞

我已经简化了上面给出的 GipStreamContent 静态类,如下所示,它运行良好,所以我希望它能帮助所有其他人。


   CloudBlockBlob blob = null;

   //azure storage connection

   var container = GetBlobClient(tenantInfo);

   //directory reference

   var directory = container.GetDirectoryReference(

   string.Format(DirectoryNameConfigValue, tenantInfo.TenantId.ToString(), documentList[0].ProjectId));


  var pushStreamContent = new PushStreamContent(async (outputStream, httpContent, transportContext) =>

  {

            //zip the multiple files

            using (var zipEntry = new ZipArchive(outputStream, ZipArchiveMode.Create, leaveOpen: false))

            {

                for (int docId = 0; docId < documentList.Count; docId++)

                {

                    blob = directory.GetBlockBlobReference(DocumentNameConfigValue + documentList[docId].DocumentId);

                    if (!blob.Exists()) continue;


                    MemoryStream memStream = new MemoryStream();

                    await blob.DownloadToStreamAsync(memStream);

                    memStream.Position = 0;

                    var createEntry = zipEntry.CreateEntry(documentList[docId].FileName, CompressionLevel.Fastest);

                    using (var stream = createEntry.Open())

                    {

                        memStream.CopyTo(stream);

                    }

                }

            }

   });  


查看完整回答
反对 回复 2021-11-14
  • 2 回答
  • 0 关注
  • 199 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信