好的,所以我正在使用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文件)。
这转化为我的代码,我似乎无法在标记中查看它...
链接正确,并下载正确的文件...
我需要做些什么来查看图像而不是下载图像吗?
谢谢大卫
更新
好的,所以我找到了这篇文章:http : //social.msdn.microsoft.com/Forums/windowsapps/en-US/b8759195-f490-420b-a587-2bb614366ad2/embedding-images-from-blob-storage-in- ssrs报告不起作用
基本上,它告诉我在上载时未设置文件类型,因此浏览器不知道如何处理。
我从这里使用了代码:http : //www.snip2code.com/Snippet/8974/NodeJS-Photo-Upload-with-Azure-Storage/
这使我可以正确上传它,现在可以在浏览器中正确查看了。
我现在遇到的问题是,当我将tempUrl放入img标签时,出现此错误:
无法加载资源:服务器的响应状态为403(服务器无法验证请求。请确保正确构成了Authorization标头的值,包括签名。)
这是完全相同的链接,如果我将其发布到浏览器中,它就可以正常工作...为什么我不能在图像标签中显示它?
更新2
好的,作为一个愚蠢的测试,我将页面加载时间以及img标签从临时网址获取源代码的时间延迟了7秒。这似乎可以解决问题(大部分时间),但是显然,即使有效,这也是一个糟糕的解决方案...
至少这可以验证,因为有时它可以工作,所以我的标记至少是正确的。
对于我的一生,我无法弄清楚为什么延误会有所作为...
有什么想法吗?
更新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.date.minutesFromNow相同的格式。看起来像这样:2013年12月13日星期五
当我这样做时,即使从浏览器中也看不到图像,更不用说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
}});
Mike是正确的,因为服务器的启动时间和本地主机之间似乎有些脱节,所以我需要设置过去的启动时间。在更新3中,我这样做,但是Mike注意到Azure不允许开始和结束时间超过60分钟...因此,在更新3中,我正在-20开始,而60结束是80分钟。
我上面提到的成功的新方法使总差异缩短了50分钟,并且完全没有任何延迟。
感谢您抽出宝贵的时间,迈克!
简短版:分布式系统(包括Azure)中会发生一些时间漂移。在创建SAS的代码中,而不是将Date.now()的开始时间设置为过去的一两分钟。然后,您应该可以消除延迟。
较长版本:创建签名并添加Date.now的计算机上的时钟可能比BLOB存储中的计算机快几秒钟。当立即向URL请求时,BLOB服务尚未达到BLOB的“开始时间”,因此抛出403。因此,通过将开始时间设置为过去的几秒钟,甚至是开始的时间,当前,如果您想覆盖大量的时钟漂移,则可以处理时钟漂移。
更新:经过一番尝试和错误:确保创建临时SAS时,它不能超过一个小时。将开始时间设置为过去的几分钟,然后设置为60分钟,则太大了。使其过期一点,然后在不到一个小时的时间内过期。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句