这里我使用的是Microsoft Storage Library,但我无法将文件上传到Azure存储
代码:
public class UploadFile {
public static void uploadFile(String sasURL,String filePath,String submissionGuid) throws MalformedURLException, URISyntaxException
{
URI sasUrl = new URI(sasURL);
try
{
CloudBlobContainer container = new CloudBlobContainer(sasUrl);
CloudBlockBlob blob = container.getBlockBlobReference(sasUrl.getPath());
File source = new File(filePath);
blob.upload(new FileInputStream(source), source.length());
}
catch (Exception e)
{
// Output the stack trace.
e.printStackTrace();
}
}
}
Sas Uri Generated是:
https://assetservice.blob.core.windows.net/org66/7594787459-5373-4485-a5ad-8b8a9b5af62c/Input/834793kfhreh-ee2a-4c80-a766-146fc139f2c4.hlkx?sv=2013-08-15&sr=b&sig=jkdhfueiwhdjscnkljshchcvdhcdsnc&se=2016-07-13T18%3A18%3A09Z&sp=w
我收到错误消息:
java.io.IOException
at com.microsoft.azure.storage.core.Utility.initIOException(Utility.java:569)
at com.microsoft.azure.storage.blob.BlobOutputStream.writeBlock(BlobOutputStream.java:444)
at com.microsoft.azure.storage.blob.BlobOutputStream.access$000(BlobOutputStream.java:53)
at com.microsoft.azure.storage.blob.BlobOutputStream$1.call(BlobOutputStream.java:388)
at com.microsoft.azure.storage.blob.BlobOutputStream$1.call(BlobOutputStream.java:385)
at java.util.concurrent.FutureTask.run(Unknown Source)
at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
at java.util.concurrent.FutureTask.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
和授权错误,即使传递的sasuri包含所有必需的参数:
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: com.microsoft.azure.storage.StorageException: Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature.
at com.microsoft.azure.storage.StorageException.translateException(StorageException.java:89)
at com.microsoft.azure.storage.core.StorageRequest.materializeException(StorageRequest.java:305)
at com.microsoft.azure.storage.core.ExecutionEngine.executeWithRetry(ExecutionEngine.java:175)
at com.microsoft.azure.storage.blob.CloudBlockBlob.uploadBlockInternal(CloudBlockBlob.java:904)
at com.microsoft.azure.storage.blob.CloudBlockBlob.uploadBlock(CloudBlockBlob.java:876)
at com.microsoft.azure.storage.blob.BlobOutputStream.writeBlock(BlobOutputStream.java:438)
... 9 more
我想我不理解我应该传递Blob-container-name的部分,因为我甚至尝试传递org66但是它对我没用。
我也很困惑,因为我的容器名称等等。
答案 0 :(得分:5)
在SAS中,每个“& sr = b”,它是一个blob级SAS而不是容器级SAS,你应该直接用它来构建你的CloudBlockBlob对象,而不是通过CloudBlobContainer:
CloudBlockBlob blob = new CloudBlockBlob(new URI(sasURL));
File source = new File(filePath);
blob.upload(new FileInputStream(source), source.length());
您可以找到有关如何正确使用容器SAS&这个official documentation中的blob SAS。虽然它基于C#,但代码通常类似。
答案 1 :(得分:0)
首先,您的SAS已于两天前过期(se = 2016-07-13)。
其次,从CloudBlobContainer docs,您使用的构造函数应该获取容器URI :
指定容器的绝对URI的Uri对象。
如果您的容器是公共的,则不需要SAS,否则 - 使用容器的SAS URI ,因为也可以为特定的blob创建SAS。