Search code examples
c#downloadgzipstreamasp.net-web-api-odatahttpresponsemessage

How to convert GZipStream to HttpContent?


I have written a Web API code to return a zip file. But I am not able to convert the GZipStream content to HttpContent. I get the following error:

cannot implicitly convert type 'system.io.compression.GZipStream' to 'System.Net.Http.HttpContent'

Where did I go wrong?

My WebApi Code:

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;

Solution

  • I have simplified the above given GipStreamContent static class like following, It's working well, so I hope It will help all others.

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