如何将 GZipStream 转换为 HttpContent?

How to convert GZipStream to HttpContent?

我已经将 Web API 代码写入 return zip 文件。但我无法将 GZipStream 内容转换为 HttpContent。我收到以下错误:

cannot implicitly convert type 'system.io.compression.GZipStream' to '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;

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

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

ZipStreamContent class,

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

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

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