GZipStream исключение на стороне сервера при распаковке сжатого файла JSZip - PullRequest
0 голосов
/ 16 марта 2020

Я работаю над 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

Любая помощь?

1 Ответ

0 голосов
/ 17 марта 2020

Надеюсь, это кому-нибудь пригодится. Проблема была в стороне сервера. Я изменил код, и он работает. Большое спасибо за все ваши комментарии.

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