一小段上传zip文件到Azure云Blob存储

时间:2020-02-04 17:44:57

标签: c# asp.net-core file-upload zip azure-blob-storage

我想将压缩文件(不超过5 MB)以小块上传到Microsoft Azure存储中的Blob容器。我已经在BlobRequestOptions中配置了4 MB的块限制,但是当我运行代码并检查Azure Cloud中的内存使用情况时,它没有成块上传。我正在使用C#.NET Core。因为我想压缩Azure云中已经存在的文件,所以首先我要下载要传输的单个文件,将流添加到zip存档中,然后再将zip上传回云中。以下是我的代码:

@Query

以下是azure cloud kudu进程资源管理器中的内存使用情况的快照(请参阅private_Memory):

memory usage

任何建议都会很有帮助。谢谢。

更新1:

使其更加清晰。我的文件已经位于Azure Blob存储中。现在,我想从容器中读取文件,创建一个包含我所有文件的ZIP。这里的主要挑战是我的代码显然正在将所有文件加载到内存中以创建zip。是否以及如何从容器中读取文件,然后将ZIP文件并行/分段地写回到同一容器中,这样我的Azure Web应用程序不需要将整个文件加载到内存中?理想情况下,我会分段读取文件,也已经开始编写zip,以便我的Azure Web应用消耗更少的内存。

1 个答案:

答案 0 :(得分:0)

我通过参考以下stackoverflow文章找到了解决方案:

How can I dynamically add files to a zip archive stored in Azure blob storage?

方法是在读取/下载输入文件的同时写入zip内存流。

下面是我的代码段:

                using (var zipArchiveMemoryStream = await zipBlockBlob.OpenWriteAsync(null, bro, null))
                using (var zipArchive = new ZipArchive(zipArchiveMemoryStream, ZipArchiveMode.Create))
                {

                    foreach (FilesListModel FileName in filesList)
                    {
                        if (await container.ExistsAsync())
                        {
                            CloudBlob file = container.GetBlobReference(FileName.FileName);

                            if (await file.ExistsAsync())
                            {
                                // zip: get stream and add zip entry
                                var entry = zipArchive.CreateEntry(FileName.FileName, CompressionLevel.Fastest);

                                // approach 1
                                using (var entryStream = entry.Open())
                                {
                                    await file.DownloadToStreamAsync(entryStream, null, bro, null);
                                    entryStream.Close();
                                }
                            }
                        }
                    }
                    zipArchiveMemoryStream.Close();

}