【问题标题】:How to convert GZipStream to HttpContent?如何将 GZipStream 转换为 HttpContent?
【发布时间】:2018-08-03 06:56:38
【问题描述】:

我编写了一个 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;

【问题讨论】:

    标签: c# download gzipstream asp.net-web-api-odata httpresponsemessage


    【解决方案1】:

    我得到了一个使用 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;
        }
    }
    

    【讨论】:

      【解决方案2】:

      我已经简化了上面给出的 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);
                          }
                      }
                  }
         });  
      

      【讨论】:

        猜你喜欢
        • 2015-09-17
        • 1970-01-01
        • 1970-01-01
        • 2016-11-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-17
        • 2010-09-08
        相关资源
        最近更新 更多