2011-04-27 28 views
12

Necesito buscar el tipo de contenido (si es imagen, audio o video) de una url que ha sido insertada por el usuario. Tengo un código como el siguiente:Forma más rápida de obtener el tipo de contenido

URL url = new URL(urlname); 
URLConnection connection = url.openConnection(); 
connection.connect(); 
String contentType = connection.getContentType(); 

estoy recibiendo el tipo de contenido, pero el problema es que parece que es necesario descargar todo el archivo para comprobar que es el tipo de contenido. Por lo tanto, es demasiado tiempo cuando el archivo es bastante grande. Necesito usarlo en una aplicación de Google App Engine para que las solicitudes estén limitadas a 30 segundos.

¿Hay alguna otra forma de obtener el tipo de contenido de una url sin descargar el archivo (por lo que podría hacerse más rápido)?

+0

Solo una idea: ¿qué tal grapar los primeros n bytes y luego cerrar la conexión? Debería ser posible adivinar el tipo de contenido en la mayoría de los casos justo al comienzo del archivo. Pero no soy profesional aquí. – pintxo

+0

@pintxo por qué harías eso si puedes leer el param del encabezado: 'Content-Type' y en lugar de obtener toda la solicitud con' GET' solo ejecutas 'HEAD' en lugar de –

Respuesta

20

Si el "otro" extremo lo admite, ¿podría utilizar el método HTTP HEAD?

+0

Gracias, me diste una buena idea – Javi

+0

Ten en cuenta las redirecciones , Me enfrenté al mismo problema con mi control de contenido remoto. Ver mi código a continuación donde lo compré. –

29

Gracias a DaveHowes respuesta y alrededor de google sobre cómo conseguir cabeza Tengo que de esta manera:

URL url = new URL(urlname); 
HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
connection.setRequestMethod("HEAD"); 
connection.connect(); 
String contentType = connection.getContentType(); 
+7

'buscando en Google acerca de cómo obtener HEAD' ¿verdad? –

9

estar al tanto de las redirecciones, enfrenté mismo problema con mi cheque de contenido remoto.
Aquí está mi solución:

/** 
* Http HEAD Method to get URL content type 
* 
* @param urlString 
* @return content type 
* @throws IOException 
*/ 
public static String getContentType(String urlString) throws IOException{ 
    URL url = new URL(urlString); 
    HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
    connection.setRequestMethod("HEAD"); 
    if (isRedirect(connection.getResponseCode())) { 
     String newUrl = connection.getHeaderField("Location"); // get redirect url from "location" header field 
     logger.warn("Original request URL: '{}' redirected to: '{}'", urlString, newUrl); 
     return getContentType(newUrl); 
    } 
    String contentType = connection.getContentType(); 
    return contentType; 
} 

/** 
* Check status code for redirects 
* 
* @param statusCode 
* @return true if matched redirect group 
*/ 
protected static boolean isRedirect(int statusCode) { 
    if (statusCode != HttpURLConnection.HTTP_OK) { 
     if (statusCode == HttpURLConnection.HTTP_MOVED_TEMP 
      || statusCode == HttpURLConnection.HTTP_MOVED_PERM 
       || statusCode == HttpURLConnection.HTTP_SEE_OTHER) { 
      return true; 
     } 
    } 
    return false; 
} 

También se puede poner un poco de contador para maxRedirectCount para evitar bucle infinito redirecciones - pero esto no se describe aquí. Esto es solo una inspiración.

+1

agradable. ¿Por qué necesita preguntar: if (statusCode! = HttpURLConnection.HTTP_OK) { – Dejell

+0

@Dejell its for handle redirects –

Cuestiones relacionadas