Java 使用SAS URL上载Azure Blob的文件失败

Java 使用SAS URL上载Azure Blob的文件失败,java,azure-storage-blobs,Java,Azure Storage Blobs,我想使用为Blob生成的SAS URL将文件上载到Azure Blob,但在执行URL时失败。我收到带有消息的HTTP错误400 未指定此请求必需的HTTP标头 这是我的密码: BlobServiceClient blobServiceClient = initBlobStorageClient(); BlobContainerClient testprovenanceContainer = getContainerClient(blobServiceClient, "testcontainer

我想使用为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();
}

当我们使用Azure Blob rest api使用sas令牌将内容上载到Azure Blob存储时,我们需要在请求头中指定
x-ms-Blob-type
。有关更多详细信息,请参阅。现在您将图像上载到Azure blob,我们可以使用
BlockBlob
作为其值

比如说 1.安装SDK

<dependency>
      <groupId>com.azure</groupId>
      <artifactId>azure-storage-blob</artifactId>
      <version>12.6.0</version>
    </dependency>

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();
            }
        }