Pregunta

Me gustaría para determinar el tipo de un archivo (generalmente UTF-8) mediante la lectura de la primera parte del archivo y el análisis del contenido. (El tipo es específico de mi comunidad pero no bajo mi control y no cubiertos por MIME / MediaType que normalmente es TEXT_PLAIN). Estoy usando la biblioteca 'org.restlet' en el cliente para analizar la cabecera con

Request request = new Request(Method.HEAD, url);

así que sé que el contenido de longitud y puede (si es necesario y posible) estimar la cantidad de bytes que debería descargar para el análisis

Aclaración: No se puede utilizar el MediaType. A partir de la respuesta 1 parece como si tuviera que obtener el contenido. Una cuestión revisada sería:

"¿Puedo obtener un parte de un archivo usando Restlet?"

RESPUESTA: El siguiente código hace lo que yo quiero. He acreditado @BalusC para mostrar el camino. Por favor, comentario si he perdido nada:

public String readFirstChunk(String urlString, int byteCount) {
    String text = null;
    if (urlString != null) {
        org.restlet.Client restletClient = new org.restlet.Client(Protocol.HTTP);
        Request request = new Request(Method.GET, urlString);
        List<Range> ranges = Collections.singletonList(new Range(0, byteCount));
        request.setRanges(ranges);
        Response response = restletClient.handle(request);
        if (Status.SUCCESS_OK.equals(response.getStatus())) {
            text = processSuccessfulChunkRequest(response);
        } else if (Status.SUCCESS_PARTIAL_CONTENT .equals(response.getStatus())) {
            text = processSuccessfulChunkRequest(response);
        } else {
            System.err.println("FAILED "+response.getStatus());
        }
    }
    return text;
}

private String processSuccessfulChunkRequest(Response response) {
    String text = null;
    try {
        text = response.getEntity().getText();
    } catch (IOException e) {
        throw new RuntimeException("Cannot download chunk", e);
    }
    return text;
}
¿Fue útil?

Solución

Esto sólo es posible si el servidor ha enviado el Accept-Ranges y Content-Range cabeceras junto con ETag o Last-Modified . Por ejemplo.

Accept-Ranges: bytes
Content-Range: bytes 0-1233/1234
ETag: file.ext_1234_1234567890

El Accept-Ranges: bytes indica que las solicitudes compatible con el servidor de volver contenido parcial en un intervalo de bytes especificado. Los informa de cabecera Content-Range sobre la longitud. El ETag y Last-Modified indican la idenfier archivo único o el último sello de tiempo modificado en el recurso detrás de la URI de la solicitud.

Si estas cabeceras están presentes en la respuesta, entonces usted puede solicitar una parte del recurso usando If-Range y Range encabezados de solicitud con respectivamente el identificador de archivo único o el último sello de tiempo modificado y el intervalo de bytes deseada.

If-Range: file.ext_1234_1234567890
Range: bytes=0-99

El ejemplo anterior devuelve los primeros 100 bytes del archivo.

Otros consejos

la operación de la cabeza, como se define en el estándar HTTP no devuelve ningún contenido, aparte de la información del encabezado. Así que si usted está enviando una solicitud cabeza, sólo se podía inspeccionar el tipo MIME del archivo de la cabecera de la respuesta HTTP.

La información del encabezado se puede obtener buscando en la Representación de regresar de envolverlo en una ClientResource y realizar una solicitud cabeza. Esto le da una interfaz de alto nivel para el transporte HTTP y no es necesario hacer el análisis sintáctico de cabecera personalizada.

ClientResource resource = new ClientResource(url);
Representation representation = resource.head();
representation.getMediaType(); // returns the Media Type

Si usted quiere hacer el tipo de contenido de adivinanzas sobre el contenido real del archivo, que tendría que descargar el contenido real, por ejemplo, con una petición GET contra ese recurso.

O al más puro estilo REST que podría modelar un parámetro de consulta adicional para su recurso que le devuelva su meta información personalizada para ese archivo, por ejemplo.

http://server/file?contentType

De manera similar, para recuperar el contenido real, usted podría tener una idea de la Corriente y luego hacer su codificación de adivinar.

Representation representation = resource.get();
InputStream stream = representation.getStream();

Para especificar rangos, si es compatible con el servidor, puede establecer los rangos, antes de presentar su solicitud GET.

List<Range> ranges = new ArrayList<Range>();
ranges.add(new Range(0,100)); // this would request the first 100 bytes
resource.setRanges(ranges);
Representation representation = resource.get();

Asegúrese de que usted consume la respuesta (corriente) por completo, antes de regresar.

Me sugieren que se vería en otros esfuerzos que le ayudan a determinar el tipo de contenido. Como aquí Java juego de caracteres y Windows O http://glaforge.free.fr/wiki/index.php?wiki = GuessEncoding

Ya que es su contenido ¿por qué no incluir todos los datos que necesita en los primeros bytes de cada archivo?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top