java - 将页面 Blob 上传到 Azure 时出现错误 : Make sure the value of Authorization header is formed correctly

标签 java azure azure-storage azure-blob-storage

我正在使用 Microsoft Azure Java SDK 上传页面 Blob(大小:20G/40G)。上传过程中,SDK 抛出存储异常:

java.io.IOException: null
    at com.microsoft.azure.storage.core.Utility.initIOException(Utility.java:584) ~[classes/:na]
    at com.microsoft.azure.storage.blob.BlobOutputStream$2.call(BlobOutputStream.java:414) ~[classes/:na]
    at com.microsoft.azure.storage.blob.BlobOutputStream$2.call(BlobOutputStream.java:398) ~[classes/:na]
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334) ~[na:1.7.0_25]
    at java.util.concurrent.FutureTask.run(FutureTask.java:166) ~[na:1.7.0_25]
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) ~[na:1.7.0_25]
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334) ~[na:1.7.0_25]
    at java.util.concurrent.FutureTask.run(FutureTask.java:166) ~[na:1.7.0_25]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) ~[na:1.7.0_25]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) ~[na:1.7.0_25]
    at java.lang.Thread.run(Thread.java:724) ~[na:1.7.0_25]
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:162) ~[azure-storage-1.2.0.jar:na]
    at com.microsoft.azure.storage.core.StorageRequest.materializeException(StorageRequest.java:306) ~[azure-storage-1.2.0.jar:na]
    at com.microsoft.azure.storage.core.ExecutionEngine.executeWithRetry(ExecutionEngine.java:178) ~[classes/:na]
    at com.microsoft.azure.storage.blob.CloudPageBlob.putPagesInternal(CloudPageBlob.java:642) ~[classes/:na]
    at com.microsoft.azure.storage.blob.CloudPageBlob.uploadPages(CloudPageBlob.java:971) ~[classes/:na]
    at com.microsoft.azure.storage.blob.BlobOutputStream$2.call(BlobOutputStream.java:402) ~[classes/:na]
    ... 9 common frames omitted

SDK版本:

<groupId>com.microsoft.azure</groupId>
<artifactId>azure-storage</artifactId>
<version>1.2.0</version>

请注意此错误在上传过程中随机出现: 传输的字节数:27325890560,总共 42949673472

Linux Box 上的时间漂移​​是否有可能导致此问题?任何其他指针都会有帮助。

调用 Azure Java SDK API 上传页面 blob 的代码片段:

String storageAccntName = "storageAccount";

URI blobEndpoint = null;
String uriString = "http://" + storageAccntName + ".blob.core.windows.net";
blobEndpoint = new URI(uriString);

CloudBlobClient blobClient = new CloudBlobClient(blobEndpoint, new StorageCredentialsAccountAndKey(storageAccntName, blobInfo.getAccessKey()));
blobClient.setAuthenticationScheme(AuthenticationScheme.SHAREDKEYFULL);
blobClient.getDefaultRequestOptions().setRetryPolicyFactory(new RetryLinearRetry());

//Create Storage Container
CloudBlobContainer container = blobClient.getContainerReference(Constants.STORAGE_CONTAINER_NAME);
container.createIfNotExists();

//Creating Page Blob corresponding to each disk
CloudPageBlob pageBlob = container.getPageBlobReference("pageBlobName");
File vhdFile  = new File("pageBlobName");
if(vhdFile.length()==0) {
    throw new CPMException("Invalid file with length 0. Stopping upload for file with path: " + vhdFile.getAbsolutePath()
            + " and file name: " + diskBlob.getLocation());
}
LOG.debug("Blob size for Disk: " + diskBlob.getName() + " is: " + vhdFile.length());

pageBlob.create(vhdFile.length());
blobClient.getDefaultRequestOptions().setConcurrentRequestCount(Constants.MAX_CONSUMER_THREADS);
pageBlob.upload(new FileInputStream(vhdFile), vhdFile.length());

最佳答案

如果您使用共享访问签名上传文件,并且 SAS 的有效期已过期,则可能会发生这种情况。根据您的 blob 大小,此上传将分为多个请求,并且当发出后续请求时,SAS 可能已过期。

如果您使用的是存储帐户和 key 而不是 SAS,请粘贴遇到此问题的代码片段。

关于java - 将页面 Blob 上传到 Azure 时出现错误 : Make sure the value of Authorization header is formed correctly,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28982217/

相关文章:

azure - 如何解决 Microsoft Azure 中的 DSInit 未找到错误?

azure - 查看/更改Azure函数应用程序的底层存储

java - 如何将 Java 字符串转换为 ASCII 字节数组?

azure - 如何使用 Microsoft Graph API 设置应用程序的访问 token 生命周期

azure - azure Monitor (insights) api 的管理员同意流程

java - azure api 应用程序 (tomcat) 通过 kudu 编辑 server.xml

azure - 无法上传 blob - 无法通过 Azure 门户获取

java - 如何获取图像渲染大小?

java - 如何使用Hibernate4Module

java - 在线性布局的 subview 中设置值