使用文件流压缩文件并上传到 Azure Blob 存储
Posted
技术标签:
【中文标题】使用文件流压缩文件并上传到 Azure Blob 存储【英文标题】:Zipping files and uploading to Azure Blobstorage using filestream 【发布时间】:2021-11-19 15:14:53 【问题描述】:我正在使用 ASP.NET Core 创建一个网站,我需要获取一堆文件,将它们压缩在一起,然后将它们上传到 Azure Blobstorage。 它成功了,我得到了一个下载链接,但是当我下载文件时,我只得到一个“文件”,我无法用任何东西打开。
这是处理上传的代码:
var moduleVersionReleaseFiles = _appDbContext
.ModuleVersionReleaseFile
.Where(x => x.ModuleVersionReleaseId == moduleVersionReleaseId)
.ToList();
string AzureBlobStorageConfig = _configuration["AzureBlobStorage"];
var connectionString = _configuration["StorageConnectionString"];
string containerName = moduleVersionReleaseId + "-" + Guid.NewGuid().ToString();
BlobServiceClient blobServiceClient = new BlobServiceClient(connectionString);
BlobContainerClient containerClient = await blobServiceClient.CreateBlobContainerAsync(containerName.ToLowerInvariant(), Azure.Storage.Blobs.Models.PublicAccessType.BlobContainer);
BlobClient blobClient = containerClient.GetBlobClient(moduleVersionReleaseId.ToString());
using var stream = new MemoryStream();
using (var archive = new ZipArchive(stream, ZipArchiveMode.Create))
foreach (var moduleVersionReleaseFile in moduleVersionReleaseFiles)
var entry = archive.CreateEntry(moduleVersionReleaseFile.File);
using (var entryStream = entry.Open())
using (var fileStream = File.OpenRead($"moduleVersionReleaseFile.Path\\moduleVersionReleaseFile.File"))
await fileStream.CopyToAsync(entryStream);
stream.Position = 0;
await blobClient.UploadAsync(stream, true);
await stream.FlushAsync();
return blobClient.Uri.ToString();
我正在使用 Azurite 进行测试,所以我无法登录 blobstorage 并在那里查看。
为什么在按预期下载文件时没有得到一个 zip 文件?
【问题讨论】:
How can I get an actual zip file there?
是什么意思?
最后一行代码 blobclient.Uri.Tostring() 返回上传的文件,但我无法用任何东西打开这个文件,我期待的是一个 zip 文件。
你遇到了什么错误?
没有错误,一切正常,但下载的文件是无法用任何东西打开的“文件”,而不是 zip 文件
【参考方案1】:
您无法打开 zip 文件的原因是它没有正确保存。请您尝试以下代码:
using var stream = new MemoryStream();
using (var archive = new ZipArchive(stream, ZipArchiveMode.Create))
foreach (var moduleVersionReleaseFile in moduleVersionReleaseFiles)
var entry = archive.CreateEntry(moduleVersionReleaseFile.File);
using (var entryStream = entry.Open())
var fileContents = File.ReadAllBytes($"moduleVersionReleaseFile.Path\\moduleVersionReleaseFile.File"));
using (BinaryWriter zipFileBinary = new BinaryWriter(entryStream))
zipFileBinary.Write(fileContents);
stream.Position = 0;
await blobClient.UploadAsync(stream, true);
【讨论】:
以上是关于使用文件流压缩文件并上传到 Azure Blob 存储的主要内容,如果未能解决你的问题,请参考以下文章
从 Azure blob 存储下载所有文件,对其进行压缩并以 JAVA 格式上传 zip 文件
使用 Node 和 graphql 将文件流式上传到 Azure Blob 存储
Azure 数据湖:将数据从 Blob 移动到 ADLS 时面临问题
我是流的新手,我需要从 ftp 下载文件并作为流发送到 azure stageblock(npm @azure/storage-blob)