好的,我正在使用Node.js和Azure Blob Storage来处理一些文件上传。
当某人上传图片时,我想向他们展示图片的缩略图。上传效果很好,我把它存储在我的blob中。
我使用了这个很好的链接(Generating Azure Shared Access Signatures with BlobService.getBlobURL() in Azure SDK for Node.js)来帮助我创建这个代码来创建共享访问临时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
}});
这会创建一个网址。
问题是当我拿到临时网址并将其插入我的浏览器时,它只会下载图像而不是查看它(在这种情况下它是一个简单的jpg文件)。
这转换为我的代码,我似乎无法在标签中查看它......
链接正确并下载正确的文件......
有什么我需要做的事情来查看图像而不是下载它吗?
谢谢, 大卫
更新
基本上它告诉我上传时没有设置文件类型,因此浏览器不知道如何处理它。
我使用了此处的代码:http://www.snip2code.com/Snippet/8974/NodeJS-Photo-Upload-with-Azure-Storage/
这使我可以正确上传它,现在可以在浏览器中正确查看。
我现在遇到的问题是,当我将tempUrl放入img标签时,我收到此错误:
无法加载资源:服务器响应状态为403(服务器无法对请求进行身份验证。请确保正确形成授权标头的值,包括签名。)
这是完全相同的链接,如果我将其发布到我的浏览器它工作得很好...为什么我不能在图像标签中显示它?
更新2
好的,所以作为一个愚蠢的测试,我从我的页面加载和img标签从temp url获取源时延迟了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
}});
我的start变量与azure.date.minutesFromNow的格式相同。它看起来像这样: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中,我这样做,但迈克注意到Azure不允许开始和结束时间超过60分钟...所以在更新3中我做了-20开始,60结束时间是80分钟。
我上面新的,成功的方式使总差异达到50分钟,并且它完全没有任何延迟。
感谢您抽出时间迈克!
答案 0 :(得分:3)
简短版本:分布式系统中存在一些时间偏差,包括在Azure中。在创建SAS而不是执行Date.now()的开始时间的代码中,将开始时间设置为过去的一两分钟。然后你应该能够消除延迟。
长版本:创建签名并添加Date.now的计算机上的时钟可能比BLOB存储中的计算机快几秒。当立即对URL发出请求时,BLOB服务还没有达到BLOB的“开始时间”,从而抛出403.所以,通过设置过去几秒的开始时间,甚至开始当前如果你想要覆盖大量的时钟漂移,你可以在处理时钟漂移时进行构建。
更新:经过一些试验和错误:确保在创建adhoc SAS时,它不能超过一小时。将开始时间设置为过去几分钟,然后将过期60分钟设置为太大。过去做一点,然后从那时起不到一个小时到期。