好的,我正在使用 Node.js 和 Azure Blob 存储来处理一些文件上传。
当一个人上传图像时,我想向他们显示图像的缩略图。上传效果很好,我将其存储在我的 blob 中。
我使用了这个很好的链接(使用 Azure SDK for Node.js 中的 BlobService.getBlobURL() 生成 Azure 共享访问签名)帮助我创建此代码来创建共享访问临时 url。
process.env['AZURE_STORAGE_ACCOUNT'] = "[MY_ACCOUNT_NAME]";
process.env['AZURE_STORAGE_ACCESS_KEY'] = "[MY_ACCESS_KEY]";
var azure = require('azure');
var blobs = azure.createBlobService();
var tempUrl = blobs.getBlobUrl('[CONTAINER_NAME]', "[BLOB_NAME]", { AccessPolicy: {
Start: Date.now(),
Expiry: azure.date.minutesFromNow(60),
Permissions: azure.Constants.BlobConstants.SharedAccessPermissions.READ
}});
这样就可以创建一个 url 了。
像这样的东西:
问题是,当我获取临时 url 并将其插入浏览器时,它只会下载图像而不是查看它(在本例中它是一个简单的 jpg 文件)。
这转化为我的代码,我似乎无法在标签中查看它......
链接是正确的并且下载了正确的文件...
我需要做些什么才能查看图像而不是下载图像吗?
谢谢,
大卫
UPDATE
好的,所以我找到了这篇文章:http://social.msdn.microsoft.com/Forums/windowsapps/en-US/b8759195-f490-420b-a587-2bb614366ad2/embedding-images-from-blob-storage-in-ssrs-report-does-not-工作
基本上它告诉我上传时没有设置文件类型,因此浏览器不知道如何处理它。
我使用了这里的代码:http://www.snip2code.com/Snippet/8974/NodeJS-Photo-Upload-with-Azure-Storage/
这使我能够正确上传它,并且现在它可以在浏览器中正确查看。
我现在遇到的问题是,当我将 tempUrl 放入 img 标记中时,出现此错误:
无法加载资源:服务器响应状态为 403(服务器无法验证请求。请确保授权标头的值正确形成,包括签名。)
这是完全相同的链接,如果我将其发布到浏览器,它就可以正常工作......为什么我不能在图像标签中显示它?
UPDATE 2
好吧,作为一个愚蠢的测试,我在页面加载时和 img 标签从临时 url 获取源代码之间设置了 7 秒的延迟。这似乎解决了问题(大多数时候),但显然,即使它有效,这也是一个蹩脚的解决方案......
至少这证明了,因为它有时有效,所以我的标记至少是正确的。
我一生都无法弄清楚为什么延迟会产生一点影响......
想法?
UPDATE 3
好的,根据下面的评论,我尝试将开始时间设置为过去 20 分钟左右。
var start = moment().add(-20, 'm').format('ddd MMM DD YYYY HH:mm:ss');
var tempUrl = blobs.getBlobUrl(Container, Filename, { AccessPolicy: {
Start: start,
Expiry: azure.date.minutesFromNow(60),
Permissions: azure.Constants.BlobConstants.SharedAccessPermissions.READ
}});
我将开始变量的格式设置为与 azure.data.mines From Now 相同的格式。看起来像这样: 2013 年 12 月 13 日星期五 14:53:58
当我这样做时,即使从浏览器中也看不到图像,更不用说 img 标签了。不确定我是否在那里做错了什么......
更新 4 - 已答复
感谢光荣的@MikeWo,我找到了解决方案。正确的代码如下:
var tempUrl = blobs.getBlobUrl('[CONTAINER_NAME]', "[BLOB_NAME]", { AccessPolicy: {
Start: azure.date.minutesFromNow(-5),
Expiry: azure.date.minutesFromNow(45),
Permissions: azure.Constants.BlobConstants.SharedAccessPermissions.READ
}});
迈克是正确的,因为服务器的启动时间和我的本地主机之间似乎存在某种脱节,因此我需要将启动时间设置为过去。在更新 3 中我就是这样做的,但 Mike 注意到 Azure 不允许开始和结束时间超过 60 分钟...所以在更新 3 中我做了 -20 开始和 60 结束,即 80 分钟。
我上面的新的、成功的方法使总时间缩短了 50 分钟,而且完全没有任何延迟。
感谢您抽出时间迈克!