Мой код (воспроизведенный ниже) подключается к URL-адресу и загружает файл на диск на Android. Все стандартные вещи. Когда я пытаюсь использовать этот код для файла на S3, доступ к которому осуществляется через поддомен на нашем сервере, сопоставленный с корзиной (например, foo.example.com => bucket с именем foo.example.com), это часто терпит неудачу. Оказывается (с помощью удобной команды 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);
}