我有一个Spring-boot应用程序,正在使用java.net.URLConnection从服务器下载文件。
对于大多数文件,我可以使用以下代码下载文件:
String localPath = "<localFilePath>";
String fromUrl = "<someUrl>";
File localFile = new File(localPath);
if (localFile.exists()) {
localFile.delete();
}
localFile.createNewFile();
URL url = new URL(fromUrl);
OutputStream out = new BufferedOutputStream(new FileOutputStream(localPath));
URLConnection conn = url.openConnection();
conn.setRequestProperty("Authorization", "Basic " + "<token>");
InputStream in = conn.getInputStream();
byte[] buffer = new byte[1024];
int numRead;
while ((numRead = in.read(buffer)) != -1) {
out.write(buffer, 0, numRead);
}
if (in != null) {
in.close();
}
if (out != null) {
out.close();
}
这对于该服务器上的大多数文件都有效,但是有一个文件可以通过服务器访问(即,我需要将基本授权传递给服务器才能访问),但是实际文件本身存储在AWS S3。
当我从服务器调用下载URL时,它会在内部重定向到AWS S3 url ...类似这样:
https://s3.amazonaws.com/<serverbucketname>/<filename>?response-content-type=application/json&X-Amz-Algorithm=<Algorithm>&X-Amz-Credential=<Credentials>&X-Amz-Date=<Date>&X-Amz-Expires=600&X-Amz-SignedHeaders=host&X-Amz-Security-Token=<SecurityToken>&X-Amz-Signature=<Signature>
此URL已包含访问资源所需的所有身份验证。因此,理想情况下,当我的代码调用原始服务器URL并将其重定向到该URL时,响应仍应下载。但是,出现以下错误:
Server returned HTTP response code: 400 for URL: https://s3.amazonaws.com/...
我不确定为什么这是对AWS服务器的错误请求。 任何想法可能出了什么问题吗?
此外,还有更好的方法吗?