如何从MemoryStream重新创建Zip文件

本文关键字:创建 Zip 文件 新创建 MemoryStream | 更新日期: 2023-09-27 17:59:23

我四处寻找解决问题的方法,但似乎没有人能达到我想要达到的目标。

我的问题是,我在Azure Blob存储中存储了Zip文件,现在为了安全起见,我们有一个API2控制器操作来提供这些Zip文件,而不是允许直接下载。此操作将检索blob,并将其下载到流中,以便将其打包到HTTPResponseMessage中。

然而,当我试图重新创建zip文件时,我会被告知它已损坏。目前,我只是试图让服务器(运行在localhost上)创建zip文件,而最终的结果是让远程客户端应用程序来做这件事(我相当确定服务器上的问题解决方案是一样的。

public class FileActionResult : IHttpActionResult 
{
  private HttpRequestMessage _request;
  private ICloudBlob _blob;
  public FileActionResult(HttpRequestMessage request, ICloudBlob blob)
  {
    _request = request;
    _blob = blob;
  }
  public async Task<HttpResponseMessage> ExecuteAsync(System.Threading.CancellationToken cancellationToken)
  {
    var fileStream = new MemoryStream();
    await _blob.DownloadToStreamAsync(fileStream);
    var byteTest = new byte[fileStream.Length];
    var test = fileStream.Read(byteTest, 0, (int)fileStream.Length);
    try
    {
      File.WriteAllBytes(@"C:'testPlatFiles'test.zip", byteTest);
    }
    catch(ArgumentException ex)
    {
      var a = ex;
    }
    var response = _request.CreateResponse(HttpStatusCode.Accepted);
    response.Content = new StreamContent(fileStream);
    response.Content.Headers.ContentLength = _blob.Properties.Length;
    response.Content.Headers.ContentType = new MediaTypeHeaderValue(_blob.Properties.ContentType);
    //set the fileName
    response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
    {
      FileName = _blob.Name,
      Size = _blob.Properties.Length
    };
    return response;  
  }
}

我已经查看了Zip库,看看是否有将Zip流转换回Zip文件的解决方案,但我所能找到的只是将Zip文件读取为流,或者创建以提供文件下载而不是文件创建。

任何帮助都将不胜感激,谢谢。

如何从MemoryStream重新创建Zip文件

您使用DotNetZip。它的ZipFile类有一个静态工厂方法,可以执行您想要的操作:ZipFile.Read( Stream zipStream )将给定流作为zip文件读取,并返回一个ZipFile实例(您可以将其用于任何用途。

但是,如果Stream包含原始zip数据,并且您只想将其持久化到磁盘,那么您应该能够直接将字节写入磁盘。

如果你遇到"zip文件损坏"错误,我会查看用于将数据发送到Azure的内容编码以及发送回的内容编码。您应该将其发送到内容类型为application/zipapplication/octet-stream的Azure,并可能向Azure blob条目添加元数据,以同样的方式发送。


编者按:DotNetZip曾经住在Codeplex。Codeplex已关闭。Codeplex上仍然可以使用旧的存档。看起来代码已经迁移到Github:

  • https://github.com/DinoChiesa/DotNetZip.看起来是原作者的回购
  • https://github.com/haf/DotNetZip.Semverd.这看起来是当前维护的版本。它还打包了一个可通过Nuget获得的https://www.nuget.org/packages/DotNetZip/