2012-06-12 17 views
11

¿Es posible obtener el nombre de un archivo descargado con HttpURLConnection?HttpURLConnection archivo descargado nombre

URL url = new URL("http://somesite/getFile?id=12345"); 
HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
conn.setRequestMethod("GET"); 
conn.setAllowUserInteraction(false); 
conn.setDoInput(true); 
conn.setDoOutput(true); 
conn.connect(); 
InputStream is = conn.getInputStream(); 

En el ejemplo anterior no puedo extraer el nombre del archivo de la URL, pero el servidor me va a enviar el nombre del archivo de alguna manera.

+0

fantástico question.Whenever tratamos de identificar el nombre del archivo obtenido en el ejercicio de solicitud de URL sobre la marcha, este caso de uso será significativo ... – sskumar86

Respuesta

14

Usted podría utilizar HttpURLConnection.getHeaderField(String name) para obtener la cabecera Content-Disposition, que normalmente se utiliza para establecer el nombre del archivo:

String raw = conn.getHeaderField("Content-Disposition"); 
// raw = "attachment; filename=abc.jpg" 
if(raw != null && raw.indexOf("=") != -1) { 
    String fileName = raw.split("=")[1]; //getting value after '=' 
} else { 
    // fall back to random generated file name? 
} 

Como otra respuesta señaló, el servidor puede devolver el nombre de archivo no válido, pero podría intentarlo

+0

Gracias, este servidor en particular parece estar enviando Content-Disposition para cada archivo solicitado a través de get get parameters. Para enlaces directos solo analizaré la url. – capitano666

+0

Después de recuperar el nombre de archivo del encabezado, ¿desde dónde descargar ese archivo? ¿Dónde estará el archivo? Por favor, ayúdame. Gracias. – Dharmendra

+0

@Dharmendra Puede usar [URLConnection.getInputStream()] (http://docs.oracle.com/javase/6/docs/api/java/net/URLConnection.html#getInputStream()) para obtener la secuencia de entrada y escribir en el archivo. –

4

La respuesta franca es que, a menos que el servidor web devuelva el nombre de archivo en el encabezado Content-Disposition, no hay un nombre de archivo real. Tal vez podría establecerlo en la última porción del URI después de/y antes de la cadena de consulta.

Map m =conn.getHeaderFields(); 
if(m.get("Content-Disposition")!= null) { 
//do stuff 
} 
+0

El servidor está enviando el nombre del archivo de alguna manera, de hecho, si usar el mismo enlace en un navegador web. Me ofrecen guardar el archivo y tiene un nombre. Simplemente no sé cómo buscarlo. – capitano666

+1

Bueno, ¡entonces estoy seguro de que el fragmento a continuación ayudará! –

0

Compruebe el Content-Disposition: encabezado del archivo adjunto en la respuesta.

0
Map map = connection.getHeaderFields(); 
      if (map.get ("Content-Disposition") != null) 
      { 
       String raw = map.get ("Content-Disposition").toString(); 
       // raw = "attachment; filename=abc.jpg" 
       if (raw != null && raw.indexOf ("=") != -1) 
       { 
        fileName = raw.split ("=")[1]; // getting value after '=' 
        fileName = fileName.replaceAll ("\"", "").replaceAll ("]", ""); 
       } 
      } 
Cuestiones relacionadas