【问题标题】:Failed file upload for Azure Blob with SAS URL使用 SAS URL 上传 Azure Blob 文件失败
【发布时间】:2023-03-08 15:33:02
【问题描述】:

我想使用为 blob 生成的 SAS URL 将文件上传到 Azure Blob,但执行 URL 时失败。我收到带有消息的 HTTP 错误 400

未指定此请求所必需的 HTTP 标头。

这是我的代码:

BlobServiceClient blobServiceClient = initBlobStorageClient();
BlobContainerClient testprovenanceContainer = getContainerClient(blobServiceClient, "testcontainer");
BlobClient blobClient = testprovenanceContainer.getBlobClient("hello.png");
OffsetDateTime expiryTime = OffsetDateTime.now().plusMinutes(5);

BlobContainerSasPermission permission = new BlobContainerSasPermission().setAddPermission(true).setWritePermission(true);
BlobServiceSasSignatureValues values = new BlobServiceSasSignatureValues(expiryTime, permission)
        .setStartTime(OffsetDateTime.now());

String s = "https://testazure.blob.core.windows.net/testcontainer/hello.png?"+blobClient.generateSas(values);
uploadFileWithUrl(new File("hello.png"), new URL(a));

public static void uploadFileWithUrl(File file, URL url) throws IOException {
    String contentType =  Files.probeContentType(file.toPath());

    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
    connection.setDoOutput(true);
    connection.setRequestMethod("PUT");
    connection.setRequestProperty("Content-type", contentType);
    connection.setRequestProperty("User-Agent", "Multi-Cloud Management 006b8507-b815-47b9-bce0-08b91981f17a");

    DataOutputStream out = new DataOutputStream (connection.getOutputStream());
    out.write(Files.readAllBytes(Paths.get(file.toURI())));
    out.close();

    // Check the HTTP response code. To complete the upload and make the object available,
    // you must interact with the connection object in some way.
    connection.getResponseCode();
    System.out.println("HTTP response code: " + connection.getResponseCode());

    connection.disconnect();
}

【问题讨论】:

    标签: java azure-blob-storage


    【解决方案1】:

    当我们使用 Azure Blob rest api 通过 sas 令牌将内容上传到 Azure blob 存储时,我们需要在请求标头中指定 x-ms-blob-type。更多详情请参考document。现在您将图像上传到 Azure blob,我们可以使用 BlockBlob 作为其值。

    例如 1.安装SDK

    <dependency>
          <groupId>com.azure</groupId>
          <artifactId>azure-storage-blob</artifactId>
          <version>12.6.0</version>
        </dependency>
    
    1. 代码
    String accountName="blobstorage0516";
            String accountKey ="";
            StorageSharedKeyCredential creds = new StorageSharedKeyCredential(accountName,accountKey);
    
            String endpoint = String.format(Locale.ROOT, "https://%s.blob.core.windows.net", accountName);
            BlobServiceClient blobServiceClient =new BlobServiceClientBuilder()
                    .endpoint(endpoint)
                    .credential(creds)
                    .buildClient();
            BlobContainerClient blobContainerClient  =blobServiceClient.getBlobContainerClient("test");
            BlobClient blobClient= blobContainerClient.getBlobClient("Hello.png");
            // set sas permissions
            BlobSasPermission permission = new BlobSasPermission().setCreatePermission(true).setWritePermission(true).setReadPermission(true);
            BlobServiceSasSignatureValues values = new BlobServiceSasSignatureValues(OffsetDateTime.now().plusDays(1), permission)
                    .setStartTime(OffsetDateTime.now().minusMinutes(5));
            // create sas token for the blob
            String sas = blobClient.generateSas(values);
            //get the blob url
            String uri =blobClient.getBlobUrl() +"?" +sas;
            URL url = null;
            File file = new File("D:\\download\\test.png");
            String contentType= null;
            DataOutputStream out=null;
            HttpURLConnection connection = null;
            try {
                contentType= Files.probeContentType(file.toPath());
                url =new URL (uri);
                connection = (HttpURLConnection) url.openConnection();
                connection.setDoOutput(true);
                connection.setRequestMethod("PUT");
                connection.setRequestProperty("Content-type", contentType);
                connection.setRequestProperty("x-ms-blob-type","BlockBlob");
                out = new DataOutputStream (connection.getOutputStream());
                out.write(Files.readAllBytes(Paths.get(file.toURI())));
                System.out.println(connection.getResponseCode());
            } catch (ProtocolException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }finally{
    
                try {
                    out.close();
                    connection.disconnect();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
    

    【讨论】:

      猜你喜欢
      • 2016-04-03
      • 2014-07-13
      • 2013-10-30
      • 2016-10-07
      • 2020-04-12
      • 2018-09-02
      • 2022-11-17
      • 2019-12-22
      • 2016-04-27
      相关资源
      最近更新 更多