Mi código (reproducido a continuación), se conecta a una url y descarga el archivo en el disco en Android. Todo lo estándar. Cuando intento usar este código en un archivo en S3 al que se accede a través de un subdominio en nuestro servidor mapeado a un segmento (por ejemplo, foo.example.com => cubo llamado foo.example.com), a menudo falla. Resulta que (mediante el comando útil rizo ..Android/Java: HttpURLConnection no devuelve los encabezados del archivo redirigido (por ejemplo, en S3)
"curl -v -L -X GET http://foo.example.com/f/a.txt")
.. que hay una redirección pasando aquí.
El archivo de descarga funciona bien, como HttpURLConnection seguirán las redirecciones de forma predeterminada, pero las llamadas que requieren la infomación cabecera (getContentLength, getHeaderFieldDate ("Last-Modified", 0), etc) son declaraciones de las cabeceras de los 307 redirección, y no los que eso es real de los archivos descargados.
Alguien sabe cómo conseguir alrededor de esto?
Gracias
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);
}
gracias. Supongo que sería un poco complicado con múltiples redireccionamientos, pero eso bien puede ayudar –
Me he encontrado con otros errores extraños en el código de redireccionamiento de varios componentes de Android. Incluso en la misma versión del sistema operativo, diferentes dispositivos los manejarían de manera diferente. Cambiamos a redirección manual como resultado. –
Ah, interesante. He estado experimentando con el uso de apache HttpClient en lugar de HttpURLConnection, y ha estado funcionando para mí (¡hasta ahora!). ¿Con qué componentes de Android has tenido problemas? –