压缩 Azure 存储文件并从 Web API 返回文件在解压缩时返回损坏的文件

问题描述 投票:0回答:1

压缩 Azure 存储文件和从 Web API 返回文件在解压缩时会返回损坏的文件。这是我的代码:

[HttpPost(nameof(DownloadFiles))]
        public async Task<IActionResult> DownloadFiles(List<string> fileNames)
        {

            CloudBlockBlob blockBlob;
            MemoryStream outputMemStream = new MemoryStream();
            ZipOutputStream zipStream = new ZipOutputStream(outputMemStream);
            Stream blobStream;
            zipStream.SetLevel(3); //0-9, 9 being the highest level of compression

            string blobstorageconnection = _configuration.GetValue<string>("BlobConnectionString");
            CloudStorageAccount cloudStorageAccount = CloudStorageAccount.Parse(blobstorageconnection);
            CloudBlobClient cloudBlobClient = cloudStorageAccount.CreateCloudBlobClient();
            CloudBlobContainer cloudBlobContainer = cloudBlobClient.GetContainerReference(_configuration.GetValue<string>("BlobContainerName"));

            using (MemoryStream memoryStream = new MemoryStream())
            {
                foreach (string fileName in fileNames)
                {
                    blockBlob = cloudBlobContainer.GetBlockBlobReference(fileName);
                    await blockBlob.DownloadToStreamAsync(memoryStream);

                    ZipEntry newEntry = new ZipEntry(blockBlob.Name);
                    newEntry.DateTime = DateTime.Now;

                    zipStream.PutNextEntry(newEntry);

                    StreamUtils.Copy(memoryStream, zipStream, new byte[4096]);
                    zipStream.CloseEntry();
                }
            };

            zipStream.IsStreamOwner = false;    // False stops the Close also Closing the underlying stream.
            zipStream.Close();                  // Must finish the ZipOutputStream before using outputMemStream.

            outputMemStream.Position = 0;

            HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
            result.Content = new StreamContent(outputMemStream);
            result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
            result.Content.Headers.ContentDisposition.FileName = "Documents.zip";
            result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
            result.Content.Headers.ContentLength = outputMemStream.Length;
            return File(outputMemStream, "application/octet-stream", "Documents.zip");
        }

我正在使用 SharpZipLib,当我下载压缩文件并解压缩它时,该文件中包含的文件已损坏。

有什么建议吗?非常感谢您的帮助

我尝试在我的 Azure 存储上压缩文件以将其下载为 zip 格式,但下载的 zip 中的文件已损坏

asp.net .net azure-blob-storage sharpziplib
1个回答
0
投票
[HttpPost(nameof(DownloadFiles))]
    public async Task<IActionResult> DownloadFiles(List<string> fileNames)
    {
        MemoryStream outputMemStream = new MemoryStream();
        ZipOutputStream zipStream = new ZipOutputStream(outputMemStream);

        zipStream.SetLevel(3); //0-9, 9 being the highest level of compression
        byte[] bytes = null;

        foreach (string fileName in fileNames)
        {
            var newEntry = new ZipEntry(fileName);
            newEntry.DateTime = DateTime.Now;

            zipStream.PutNextEntry(newEntry);

            bytes = await CreateFile(fileName);

            MemoryStream inStream = new MemoryStream(bytes);
            StreamUtils.Copy(inStream, zipStream, new byte[4096]);
            inStream.Close();
            zipStream.CloseEntry();
        }

        zipStream.IsStreamOwner = false;    // False stops the Close also Closing the underlying stream.
        zipStream.Close();          // Must finish the ZipOutputStream before using outputMemStream.

        outputMemStream.Position = 0;

        return File(outputMemStream.ToArray(), "application/octet-stream", "directory.zip");
    }
    private async Task<byte[]> CreateFile(string fileName)
    {
        byte[] bytes = null;
        await using (MemoryStream ms = new MemoryStream())
        {
            CloudBlockBlob blockBlob;
            string blobstorageconnection = _configuration.GetValue<string>("BlobConnectionString");
            CloudStorageAccount cloudStorageAccount = CloudStorageAccount.Parse(blobstorageconnection);
            CloudBlobClient cloudBlobClient = cloudStorageAccount.CreateCloudBlobClient();
            CloudBlobContainer cloudBlobContainer = cloudBlobClient.GetContainerReference(_configuration.GetValue<string>("BlobContainerName"));
            blockBlob = cloudBlobContainer.GetBlockBlobReference(fileName);
            await blockBlob.DownloadToStreamAsync(ms);
            bytes = ms.ToArray();
        }

        return bytes;
    }
© www.soinside.com 2019 - 2024. All rights reserved.