压缩Azure存储文件并共享只读下载链接C#

uttx8gqw  于 12个月前  发布在  C#
关注(0)|答案(1)|浏览(161)

Azure存储是否提供开箱即用的功能来压缩选定的文件并从C# Dotnet核心代码共享下载链接?如果没有,我预见的方法是下载文件在我的C#代码中创建一个zip。

utugiqy6

utugiqy61#

Azure存储本身不提供开箱即用的功能来压缩选定的文件并直接共享下载链接。
您可以尝试以下步骤来实现您的要求:
1)使用Azure Blob Storage客户端库将文件从Azure Storage下载到应用程序的本地存储或内存。
2)下载文件后,使用.NET的System.IO.Compression命名空间创建一个zip文件。根据应用程序的需要和文件的大小,您可以将此zip文件临时存储在服务器的本地磁盘上或将其保存在内存中。
3)创建zip文件后,将其上载回Azure Blob存储。
4)为上载的zip文件创建SAS URL。此URL将提供对具有特定权限的文件的访问权限,并在定义的时间段内。与需要下载zip文件的用户共享此SAS URL。此URL将允许他们直接从Azure存储下载文件。
下面是示例代码:

using Azure.Storage.Blobs;
using Azure.Storage.SAS;
using System.IO;
using System.IO.Compression;

public async Task<string> CreateAndShareZipAsync(string containerName, List<string> fileNames)
{
    BlobServiceClient serviceClient = new BlobServiceClient("your_connection_string");
    BlobContainerClient containerClient = serviceClient.GetBlobContainerClient(containerName);

    using MemoryStream zipStream = new MemoryStream();

    using (ZipArchive zip = new ZipArchive(zipStream, ZipArchiveMode.Create, true))
    {
        foreach (var fileName in fileNames)
        {
            BlobClient blobClient = containerClient.GetBlobClient(fileName);
            var blobDownloadInfo = await blobClient.DownloadAsync();

            ZipArchiveEntry zipEntry = zip.CreateEntry(fileName);

            using Stream entryStream = zipEntry.Open();
            await blobDownloadInfo.Value.Content.CopyToAsync(entryStream);
        }
    }

    string zipFileName = "your_zip_file_name.zip";
    BlobClient zipBlobClient = containerClient.GetBlobClient(zipFileName);
    zipStream.Position = 0; 
    await zipBlobClient.UploadAsync(zipStream);

    BlobSasBuilder sasBuilder = new BlobSasBuilder
    {
        BlobContainerName = containerName,
        BlobName = zipFileName,
        Resource = "b", // b for blob
        StartsOn = DateTime.UtcNow,
        ExpiresOn = DateTime.UtcNow.AddHours(24) // link validity
    };
    sasBuilder.SetPermissions(BlobSasPermissions.Read);

    string sasToken = sasBuilder.ToSasQueryParameters(new StorageSharedKeyCredential("your_account_name", "your_account_key")).ToString();
    string sasUrl = zipBlobClient.Uri + "?" + sasToken;

    return sasUrl;
}

字符串

相关问题