【问题标题】:Unable to upload file to SAS URI无法将文件上传到 SAS URI
【发布时间】:2016-11-17 21:44:14
【问题描述】:

这里我使用的是 Microsoft 存储库,但我无法将文件上传到 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 是:

 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 但它对我不起作用。

我也对我的容器名称等感到困惑。

【问题讨论】:

  • 您是否知道您的 SAS 已在两天前过期 (se=2016-07-13)?
  • 是的,我知道这一事实,我随机更改了这些数字只是为了将其发布到公共领域

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


【解决方案1】:

根据您的 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());

您可以在official documentation 中找到有关如何正确使用容器 SAS 和 blob SAS 的详细信息。虽然它是基于 C# 的,但代码大体相似。

【讨论】:

  • 我没有错误,但是有没有办法可以跟踪上传状态,一旦完成,我可以继续其他工作?
  • 在仪表板中它仍然显示等待上传我正在关注:msdn.microsoft.com/en-us/library/windows/hardware/… 用于 Windows 10 的驱动程序签名自动化。我被困在第 4 步
【解决方案2】:

首先,您的 SAS 已于两天前到期 (se=2016-07-13)。

其次,从CloudBlobContainer docs你使用的构造函数应该得到容器URI

一个 Uri 对象,指定容器的绝对 URI。

如果您的容器是公共的,则不需要 SAS,否则 - 对容器使用 SAS URI,因为也可以为特定的 blob 创建 SAS。

【讨论】:

  • If your container is public, you don't need SAS
  • 我不明白我该怎么做,我被困在这一点上。
  • @MikasaAckerman 您是如何生成 SAS 的?你的代码看起来不错,但你可能正在为这个特定的 blob 使用 SAS
  • 将带有特定 json 的标头中的授权令牌传递给 sysdevendpoint =devicesigningservice.cloudapp.net/api/signing/devices url 以获取 sas 响应
猜你喜欢
  • 1970-01-01
  • 2019-11-19
  • 2020-12-09
  • 1970-01-01
  • 1970-01-01
  • 2020-01-08
  • 2017-10-14
  • 2017-02-14
  • 1970-01-01
相关资源
最近更新 更多