【问题标题】:Upload an image file to azure blob storage from js从 js 将图像文件上传到 azure blob 存储
【发布时间】:2013-07-29 00:04:05
【问题描述】:

我正在尝试将图像文件从 html 页面上传到 azure blob 存储。到目前为止,我已经编写了一个 Web 服务来为我的 blob 容器创建一个 SAS。由此我创建了格式为“blob 地址”/“容器名称”/“blob 名称”的 uri? “萨斯”。我的 html 页面上有一个上传控件。

然后我尝试使用以下代码上传文件:

var xhr = new XMLHttpRequest();
xhr.upload.addEventListener("progress", uploadProgress, false);
xhr.addEventListener("load", uploadComplete, false);
xhr.addEventListener("error", uploadFailed, false);
xhr.addEventListener("abort", uploadCanceled, false);
xhr.open("PUT", blobPath);
xhr.send(upFile.files[0]);

其中 blobPath 是上面的 uri,upFile 是我的 html 上传控件。

当我尝试上传文件时,会触发 uploadFailed 例程。所以: 这是正确的方法吗? 如何捕获上传返回的错误,以便查看问题所在?

我的 sas 看起来像:“sr=c&si=mypolicy&sig=onZTE4buyh3JEQT3%2B4cJ6uwnWX7LUh7fYQH2wKsRuCg%3D”

任何帮助表示赞赏,谢谢。

【问题讨论】:

标签: javascript image file-upload azure azure-blob-storage


【解决方案1】:

这当然是正确的方法,但是有一些事情:

  1. 您必须在请求中包含x-ms-blob-type 请求标头,其值应为BlockBlob。
  2. 另外请注意,要使其正常工作,您需要将 HTML 页面托管在同一个存储帐户中,因为截至目前,Azure Blob 存储不支持 CORS。因此,如果您的 html 页面托管在其他域中,您会因为 CORS 而出现错误。

您可能会发现这些博客文章对于使用 SAS 和 AJAX 上传 Blob 很有用:

http://coderead.wordpress.com/2012/11/21/uploading-files-directly-to-blob-storage-from-the-browser/

http://gauravmantri.com/2013/02/16/uploading-large-files-in-windows-azure-blob-storage-using-shared-access-signature-html-and-javascript/

【讨论】:

  • 谢谢,这些是我一直在努力关注的博客文章。我现在已将上传代码交换为 ajax 调用(包括“x-ms-blob-type”标头),如您的博客文章中所示,但它仍然无法正常工作。另外,您能否解释一下“您需要将 HTML 页面托管在同一个存储帐户中”的含义。我的 html 页面在云服务中运行。云服务与 blob 存储在同一个 azure 帐户中,我已将云服务链接到 blob 存储帐户。够了吗?谢谢
  • 立即上传:'$.ajax({ url: blobPath, type: "PUT", data: upFile.files[0], processData: false, beforeSend: function (xhr) { xhr.setRequestHeader ('x-ms-blob-type', 'BlockBlob'); xhr.setRequestHeader('Content-Length', upFile.files[0].size); }, 成功: function (data, status) { console.log (数据);console.log(状态);},错误:函数(xhr,desc,err){console.log(desc);console.log(err);}});'这会触发错误情况,但 'err' 是 ""。
  • 你能把整个代码贴出来吗?由于您的 HTML 文件(位于您的云服务中)和您的 blob 存储位于不同的域中,因此您遇到了 CORS 问题 (en.wikipedia.org/wiki/Cross-origin_resource_sharing)。为了使 Ajax 调用正常工作,源和目标必须在同一个域中,因此我的评论 "you would need to host your HTML page in the same storage account。请尝试通过将 HTML 文件复制到同一存储帐户中来运行您的代码。此外,您可能希望通过 Fiddler 跟踪您的请求/响应。
  • 我不知道如何在存储帐户中运行我的 html 文件。我需要我的 html 页面成为我的云服务的一部分。你能进一步解释一下吗?
  • 还有其他方法可以做到这一点吗?我所需要的只是能够将文件从 html 页面上传到 azure blob(或者这不是一件简单的事情吗?)。我可以将我的文件从我的 html 页面上传到本地存储吗?我知道如何将我的文件从本地存储传输到 Blob 存储。
【解决方案2】:

我现在找到了解决这个问题的方法。我的上传现在工作如下:

  • 我将文件作为 DataURL 读入 FileReader

  • 我将返回的字符串切片并将每个切片发送到服务器 它存储在会话变量中的位置

  • 一旦整个文件发送完毕,我就会调用另一个 Web 服务 将切片重新粘合在一起并将结果转换为字节数组

  • 然后将字节数组作为文件存储在 azure 的本地存储中

  • 最终文件从本地存储转移到 Blob 存储中

查看代码:

Upload files from html to azure

【讨论】:

  • 此解决方案是否需要 CORS?
  • 有关更多详细信息,请参阅“将文件从 html 上传到 azure”上方的链接。我想出了这个解决方案,因为我遇到了 CORS 的问题(请参阅下面的 cmets)。
猜你喜欢
  • 2021-01-16
  • 2018-12-17
  • 1970-01-01
  • 2017-09-21
  • 2021-03-07
  • 2017-01-24
  • 2017-08-19
  • 1970-01-01
  • 2020-01-25
相关资源
最近更新 更多