gpt4 book ai didi

java - 无法从 Java 下载 Azure blob

转载 作者:行者123 更新时间:2023-12-03 01:22:50 25 4
gpt4 key购买 nike

这是一个相当奇怪的问题。我需要生成一个签名的网址,可以与其他人共享,以便在一定的时间限制内下载文件。显然,由于我说的是已签名,因此您不需要任何事先许可即可下载。以下是我用来上传和下载的代码

  private final BlobSasPermission blobSasPermission = new BlobSasPermission()
.setReadPermission(true);

public String uploadAndGenerateSignedUrl(String filePath, String uploadPath) {
BlobClient blobClient = containerClient.getBlobClient(uploadPath);
blobClient.uploadFromFile(filePath);

BlockBlobClient blockBlobClient = blobClient.getBlockBlobClient();
BlobServiceSasSignatureValues blobServiceSasSignatureValues = new BlobServiceSasSignatureValues(
OffsetDateTime.now().plusMinutes(azureConfiguration.getExpiryMin()), blobSasPermission);
return blockBlobClient.getBlobUrl() + "?" + blockBlobClient
.generateSas(blobServiceSasSignatureValues);
}

public void downloadFromUrl(String signedUrl, File file) throws IOException {
OkHttpClient client = SharedClient.getNewSharedClientBuilder().build();

Request request = new Request.Builder()
.url(signedUrl)
.build();

okhttp3.Response response = client.newCall(request).execute();
InputStream inputStream = response.body().byteStream();
FileUtils.copyInputStreamToFile(inputStream, file);
}

现在,当我在浏览器中打开生成的网址时,文件已成功下载。同样,在 PostMan 中针对此 url 运行 GET 也可以正常工作。但是,当我向下载方法发送相同的 url 时,它会失败并显示错误 403,指出服务器无法验证请求。我对其中的原因一无所知。我尝试将 http 和 https 协议(protocol)添加到签名网址,但这也没有帮助。

编辑:

添加错误消息
响应{protocol=http/1.1,code=403,message=服务器无法验证请求。确保授权 header 的值格式正确,包括签名。,url=https://{account}.blob.core.windows.net/{container}/MDConnector/MDTest/Test_16269425/2021-07-24/1627125196450/NormalFile.md?sv=2019-07-07&se=2021-07-24T12:13:18Z&sr=b&sp=r&sig=BoTaZ9iEA8Cdcbscf6zpWTol32+52rfVyLNDMBlLr1Q=}

最佳答案

我能够重现这个问题。本质上,问题是由于 SAS token 签名中的 + 符号引起的。创建 URL 时,+ 符号被解释为空格,因此您的授权失败。

您需要做的是对您的 SAS token 进行 URL 编码。一旦你这样做了,你的请求就应该可以正常工作。请参阅下面的示例代码:

package com.company;

import okhttp3.OkHttpClient;
import okhttp3.Request;

import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;

public class Main {

public static void main(String[] args) throws IOException {
String url = "https://account.blob.core.windows.net/container/blob.png";
String sasToken = "sv=2020-04-08&st=2021-07-24T14:33:27Z&se=2021-07-31T14:33:00Z&sr=b&sp=rac&sig=QytPc/+0z/eHd+u4WO0HGOFDOZjVfB+vbQdbR6FFrl4=";//Notice the "+" sign in SAS token.
sasToken = URLEncoder.encode(sasToken, StandardCharsets.UTF_8.toString());
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder().url(url+"?"+ sasToken).build();
okhttp3.Response response = client.newCall(request).execute();
InputStream inputStream = response.body().byteStream();
}
}

关于java - 无法从 Java 下载 Azure blob,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68510129/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com