Java:通过身份验证从重定向资源下载文件

时间:2019-02-12 23:30:16

标签: amazon-web-services spring-boot amazon-s3 resttemplate

我有一个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服务器的错误请求。 任何想法可能出了什么问题吗?

此外,还有更好的方法吗?

0 个答案:

没有答案