如何从Azure的Blob存储中下载文件

13 浏览
0 Comments

如何从Azure的Blob存储中下载文件

我正在尝试使用jquery的$.ajax()方法从Azure的Blob存储中下载文件。

我使用以下C#代码来下载blob,我相信问题出在这里。

以上代码是由以下ajax调用触发的。

我在服务器端的C#代码上设置了一个断点,它正在命中那段代码。然而,文件在客户端端没有下载。控制台中也没有任何错误。

任何帮助或建议将不胜感激。

谢谢

0
0 Comments

如何从Azure的Blob存储中下载文件

问题出现的原因:根据AFAIK,我们无法直接通过Ajax调用来下载文件。因此,需要通过其他方法来实现文件的下载。

解决方法:可以创建一个单独的WebForm页面,将输出Blob文件的代码移动到Page_Load方法中,并使用查询字符串来传递参数。具体代码如下:

protected void Page_Load(object sender, EventArgs e)
{
    var blobStorageName = Request.QueryString["blobStorageName"];
    var companyID = Request.QueryString["companyID"];
    CloudStorageAccount storageAccount = CloudStorageAccount.Parse(Microsoft.Azure.CloudConfigurationManager.GetSetting("StorageConnectionString"));
    CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
    CloudBlobContainer container = blobClient.GetContainerReference(System.Text.RegularExpressions.Regex.Replace(companyID.ToLower(), @"\s+", ""));
    CloudBlockBlob blockBlob = container.GetBlockBlobReference(blobStorageName);
    System.IO.MemoryStream memStream = new System.IO.MemoryStream();
    blockBlob.DownloadToStream(memStream);
    HttpResponse response = HttpContext.Current.Response;
    response.ContentType = blockBlob.Properties.ContentType;
    response.AddHeader("Content-Disposition", "Attachment; filename=" + blobStorageName.ToString());
    response.AddHeader("Content-Length", blockBlob.Properties.Length.ToString());
    response.BinaryWrite(memStream.ToArray());
}

然后在客户端,可以通过以下方式下载文件:

window.location = "/FroalaImageUpload.aspx?blobStorageName=2017%2F11%2F7%2F2017-7-10-1.png&companyID=images";

此外,还可以使用`iframe`来下载文件。详细信息可以参考类似问题的解决方案

作者通过在页面上添加一个``元素,并将其onclick事件指向下载函数,成功解决了问题。他确认无法通过AJAX调用直接下载文件。

0