首页 > 解决方案 > 解压 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

有什么帮助吗?

标签: asp.netangularasp.net-coregzipstreamjszip

解决方案


我希望这对某人有用。问题出在服务器端。我更改了代码并且它正在工作。非常感谢您的所有评论。

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

推荐阅读