У меня есть приложение 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-адрес загрузки с сервера, он внутренне перенаправляется на URL-адрес AWS S3 ... Примерно так:
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 ..?Есть идеи, что может пойти не так?
Кроме того, есть ли лучший способ сделать это?