Мой код (воспроизводится ниже), подключается к URL и загружает файл на диск на Android.Все стандартные вещи.Когда я пытаюсь использовать этот код в файле на S3, доступ к которому осуществляется через поддомен на нашем сервере, сопоставленном с корзиной (например, foo.example.com => bucket с именем foo.example.com), это часто приводит к сбою.Оказывается (используя команду handy curl ..
"curl -v -L -X GET http://foo.example.com/f/a.txt")
.., что здесь происходит перенаправление.
Загрузка файла работает нормально, так как HttpURLConnection будет следовать перенаправлениям по умолчанию, новызовы, требующие информации заголовка (getContentLength, getHeaderFieldDate («Last-Modified», 0) и т. д.), возвращают заголовки из перенаправления 307, а не фактический загруженный файл.
Кто-нибудь знает, как получитьвокруг этого?
Спасибо
File local = null;
try {
Log.i(TAG, "Downloading file " + source);
conn = (HttpURLConnection) new URL(source).openConnection();
fileSize = conn.getContentLength(); // ** THIS IS WRONG ON REDIRECTED FILES
out = new BufferedOutputStream(new FileOutputStream(destination, false), 8 * 1024);
conn.connect();
stream = new BufferedInputStream(conn.getInputStream(), 8 * 1024);
byte[] buffer = new byte[MAX_BUFFER_SIZE];
while (true) {
int read = stream.read(buffer);
if (read == -1) {
break;
}
// writing to buffer
out.write(buffer, 0, read);
downloaded += read;
publishProgress(downloaded, fileSize);
if (isCancelled()) {
return "The user cancelled the download";
}
}
} catch (Exception e) {
String msg = "Failed to download file " + source + ". " + e.getMessage();
Log.e(TAG, msg );
return msg;
} finally {
if (out != null) {
try {
out.flush();
out.close();
} catch (IOException e) {
Log.e(TAG, "Failed to close file " + destination);
e.printStackTrace();
}
}
if (stream != null) {
try {
stream.close();
} catch (IOException e) {
Log.e(TAG, "Failed to close file " + destination);
e.printStackTrace();
}
} else {
long dateLong = conn.getHeaderFieldDate("Last-Modified", 0 ); // ** THIS IS WRONG ON REDIRECTED FILES
Date d = new Date(dateLong);
local.setLastModified(dateLong);
}