asp.net - 解压 JSZip 压缩文件时服务器端出现 GZipStream 异常
问题描述
我正在服务器端开发 ASP.net 核心 Web API,在客户端开发 Angular 8。
我需要压缩文件列表并发送到服务器并在服务器中解压缩。我在客户端使用 JSZip 进行压缩,我的客户端代码是:
zipAndAddFileToUploader2(file: File): void {
const fileName = file.name
var url = URL.createObjectURL(file)
let self = this;
JSZipUtils.getBinaryContent(url, function (err, data) {
if(err) {
throw err;
}
var zip = new JSZip();
zip.file(fileName, data);
zip.generateAsync({type:'blob', compression: 'DEFLATE', compressionOptions: { level: 9 }})
.then(function(content) {
var file_object = new File([content], fileName, {type: 'application/zip'});
self.uploader.addToQueue([file_object]);
});
});
}
我的服务器端如下:
static byte[] Decompress(byte[] data)
{
byte[] byteArray = null;
using (var compressedStream = new MemoryStream(data))
using (MemoryStream decompressedFileStream = new MemoryStream(data))
{
using (GZipStream decompressionStream = new GZipStream(compressedStream, CompressionMode.Decompress))
{
decompressedFileStream.Position = 0;
decompressionStream.CopyTo(decompressedFileStream);//Exception ****
byteArray = decompressedFileStream.ToArray();
}
}
return byteArray;
}
CopyTo(decompressedFileStream) 抛出以下异常:
例外:存档条目是使用不受支持的压缩方法压缩的。
异常详情:
at System.IO.Compression.Inflater.Inflate(FlushCode flushCode)
at System.IO.Compression.Inflater.ReadInflateOutput(Byte* bufPtr, Int32 length, FlushCode flushCode, Int32& bytesRead)
at System.IO.Compression.Inflater.ReadOutput(Byte* bufPtr, Int32 length, Int32& bytesRead)
at System.IO.Compression.Inflater.InflateVerified(Byte* bufPtr, Int32 length)
at System.IO.Compression.DeflateStream.CopyToStream.Write(Byte[] buffer, Int32 offset, Int32 count)
at System.IO.MemoryStream.CopyTo(Stream destination, Int32 bufferSize)
at System.IO.Compression.DeflateStream.CopyToStream.CopyFromSourceToDestination()
at System.IO.Compression.DeflateStream.CopyTo(Stream destination, Int32 bufferSize)
at System.IO.Compression.GZipStream.CopyTo(Stream destination, Int32 bufferSize)
at System.IO.Stream.CopyTo(Stream destination)
at MyApp.MyService.Decompress(Byte[] data) in C:\...\MyService.cs:line 125
at MyApp.MyService.<UpdateMyFile>d__24.MoveNext() in C:\...\MyService.cs:line 137
有什么帮助吗?
解决方案
我希望这对某人有用。问题出在服务器端。我更改了代码并且它正在工作。非常感谢您的所有评论。
static byte[] Decompress(byte[] data)
{
MemoryStream memoryStream = new MemoryStream();
memoryStream.Write(data, 0, data.Length);
ZipArchive archive = new ZipArchive(memoryStream);
ZipArchiveEntry entry = archive.Entries.FirstOrDefault();
if (null == entry)
return null;
var stream1 = entry.Open();
using (var ms = new MemoryStream())
{
stream1.CopyTo(ms);
return ms.ToArray();
}
}
推荐阅读
- javascript - 在自定义页眉之后和页脚之前添加空格
- forms - TextFields 中的自定义错误消息小部件 - Flutter
- excel - VBA 新手,需要简单的脚本来使用循环检查/更改单元格值
- swift - UIKeyInput keyboard type protocol requirement does not match
- ruby-on-rails - 在 Rails 中将 JSON 对象存储为 JSONB 列类型时出现问题
- javascript - 在 JavaScript 中从 JSON 读取数据
- cygwin - 为什么 ls 说“文件存在”?
- r - 如何保存闪亮的应用程序会话内存?
- ckeditor - CkEditor5 insertContent 功能不起作用
- java - ML Kit Vision - 由于“int android.graphics.Bitmap.getWidth()”,使用内存图像中的摄像头检测条形码会导致空指针异常