如何从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文件读取为流,或者创建以提供文件下载而不是文件创建。
任何帮助都将不胜感激,谢谢。
您使用DotNetZip
。它的ZipFile
类有一个静态工厂方法,可以执行您想要的操作:ZipFile.Read( Stream zipStream )
将给定流作为zip文件读取,并返回一个ZipFile
实例(您可以将其用于任何用途。
但是,如果Stream
包含原始zip数据,并且您只想将其持久化到磁盘,那么您应该能够直接将字节写入磁盘。
如果你遇到"zip文件损坏"错误,我会查看用于将数据发送到Azure的内容编码以及发送回的内容编码。您应该将其发送到内容类型为application/zip
或application/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/