我正在开发一个POC,我必须创建一个模拟设备并连接到IOT HUB,这部分是在一些外部应用程序向该设备的IOT HUB发送消息之后完成的。
消息包含blob存储SAS URI,我需要将该文件下载到设备。
模拟设备能够获取SAS URI,但当我开始下载文件时,我得到错误。
线程“main”中的异常com.microsoft.azure.storage.StorageException:服务器无法验证请求。确保正确形成Authorization标头的值,包括签名。
如果我的方法是错误的,请纠正我,并为此用例使用适当的approch纠正我。
private static void download(String message) throws StorageException, IOException, JSONException, URISyntaxException {
// need to download the file to simulator in folder
try {
JSONObject jsonObject = new JSONObject(message);
String sasUri = (String) jsonObject.get("fileUrl");
System.out.println("SAS URI from hub ->" + sasUri + " ");
URI url = new URI(sasUri);
//downloadFile(sasUri);
System.out.println("end of file download function");
CloudBlob blob = new CloudBlockBlob(url);
blob.downloadToFile("/path/to/download/file");
} catch(Exception e) {
e.printStackTrace();
}
}
以下是SAS URI: -
的https://*******.blob.core.windows.net/test/testfile.zip SV = 2017年7月29日&安培; SS = B和= SRT SCO&安培; SP =&rwdlac放大器; SE = 2018-04-16T13:33:22Z&安培; ST = 2018-04-16T05:00:22Z&安培; SPR = HTTPS&安培; SIG = ***********
我直接从azure portal获取SAS URI,而不是在运行时生成。
提前致谢!
答案 0 :(得分:0)
要缩小问题范围,您可以尝试使用以下方法来查看是否有帮助。
单击“下载”,在Azure门户中获取blob的URI:
之后,将下载该文件。您可以在资源管理器下载历史记录中找到URI。 URI格式将是这样的:
https://[storage-account].blob.core.windows.net/testdownload/20180417_4.zip?sv=2017-07-29&ss=bqtf&srt=sco&sp=rwdlacup&se=2018-04-19T15:52:15Z&sig=[signature]
在以下代码段中直接使用此URI,它将起作用。
CloudBlob blob = new CloudBlockBlob(url);
await blob.DownloadToFileAsync(imgPath, System.IO.FileMode.CreateNew);
Upate:从Azure门户获取绝对URI到blob 的另一种方法如下:
首先获得 SAS令牌。请注意开始和到期日期/时间。该令牌仅在此时间段内有效。
第二次获取 blob网址。
最后,blob的完整绝对URI 是 blob网址加上 SAS令牌。它会是这样的:
https://ritastorageaccount.blob.core.windows.net/?sv=2017-07-29&ss=b&srt=sco&sp=rwdlac&se=2018-04-26T10:01:47Z&st=2018-04-26T02:01:47Z&spr=https&sig=[SIG]