Azure 使用共享访问签名对多个文件进行压缩,并从流下载

本文关键字:压缩 下载 文件 共享 访问 Azure | 更新日期: 2023-09-27 18:33:17

是否可以使用共享访问签名将多个文件直接压缩到输出流,然后将其发送给用户?


我正在使用共享访问签名从我的 blob 存储下载 blob,并使用 DotNetZip 压缩 blob(或至少尝试(。

   var images = _fileService.GetImages(companyID, model.ImageIDs).ToList();
        if (images != null && images.Count > 0)
        {
            DateTime currentTime = TimeZoneExtensions.GetCurrentDate();
            using (ZipFile zip = new ZipFile())
            {
                MemoryStream output = new MemoryStream();
                foreach (var image in images)
                {
                    if (image.ImageLinks != null)
                    {
                        //ImageLinks contains SAS uri for each image format..
                        List<ImageLinkModel> imageLinks = image.ImageLinks.Where(m => m.FormatID == model.FormatID).ToList();
                        if (imageLinks != null && imageLinks.Count > 0)
                        {
                            foreach (var imageLink in imageLinks)
                            {
                                if (String.IsNullOrEmpty(imageLink.DownloadURL) || imageLink.DateExpiresDownloadURL < currentTime)
                                {
                                    int hours = 1;
                                    imageLink.DateExpiresDownloadURL = currentTime.AddHours(hours);
                                    //Create new shared access signature
                                    imageLink.DownloadURL = _fileService.GetDownloadImageURL(imageLink.BlobName, image.ImageName, hours);
                                    //Update imagelink
                                    _fileService.UpdateImageLink(companyID, imageLink);
                                    //Exception here
                                    zip.AddDirectory(imageLink.DownloadURL);
                                }
                                else
                                {
                                    //Use existing SAS download url
                                    Exception here
                                    zip.AddDirectory(imageLink.DownloadURL);
                                }
                            }
                            zip.Save(output);
                        }
                    }
                }
                return File(output, "application/zip", "sample.zip");
            }
        }

这就是我到目前为止想出的。

运行此方法并将文件添加到zip时,我得到异常: System.ArgumentException URI format not supported .我假设您只能将本地路径添加到有意义的zip中,所以现在我不知道了。

这是我的 SAS 网址之一:

http://mystorage.blob.core.windows.net/images/22201642127PM625F493A7418BA855265516DF8038?sv=2015-04-05&sr=b&sig=%2FdNy6l6qyn7H1fh4D8T1Rd7emzgs%2B4GgQFlPoCOwBW4%3D&st=2016-02-05T09%3A35%3A04Z&se=2016-02-05T10%3A50%3A04Z&sp=r&rscd=Attachment%3B%20f...

URL 没有错,(我可以在不压缩的情况下下载(。

我在这里试图做不可能的事情吗?我是否被迫像这样以正常方式下载 blob,然后压缩它们?

谢谢

Azure 使用共享访问签名对多个文件进行压缩,并从流下载

在 Azure 看来,blob 存储只是一个边界,其中包含一些位和字节。它没有文件类型的概念,也没有处理程序来对它们执行任何操作。(HTTP也没有(

您希望在不存在的存储中获得智能。您唯一能做的就是下载 URI

所以是的,您需要下载它,然后压缩它,然后将其发送到任何地方。