怎么把GZipStream转换成HttpContent?

时间:2018-08-03 06:56:39

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

我已经编写了一个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 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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