visual subir studio proyecto programa hacer empaquetar ejecutar ejecutable distribuir datos crear con como aplicacion java http restlet

java - subir - Leyendo la primera parte de un archivo usando HTTP



subir proyecto a github windows (3)

Me gustaría determinar el tipo de archivo (generalmente UTF-8) leyendo la primera parte del archivo y analizando el contenido. (El tipo es específico de mi comunidad pero no está bajo mi control y no está cubierto por MIME / MediaType, que normalmente es TEXT_PLAIN). Estoy usando la biblioteca ''org.restlet'' en el cliente para analizar el encabezado con

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

entonces sé la longitud del contenido y puedo (si es necesario y posible) estimar cuántos bytes debería descargar para el análisis

ACLARACIÓN: No puedo usar MediaType. De la respuesta 1 parece que tengo que OBTENER el contenido. Por lo tanto, una pregunta revisada sería:

"¿PUEDO OBTENER parte de un archivo usando Restlet?"

RESPUESTA: El siguiente código hace lo que quiero. He acreditado a @BalusC por mostrarme el camino. Comente si me he perdido algo:

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; }


Dado que es su contenido, ¿por qué no solo incluye todos los datos que necesita en los primeros bytes de cada archivo?


Eso solo es posible si el servidor ha enviado los Accept-Ranges Content-Range junto con ETag o Last-Modified . P.ej

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

Los Accept-Ranges: bytes indica que el servidor admite solicitudes que devuelven contenido parcial en un rango de bytes especificado. El encabezado Content-Range informa sobre la longitud. ETag y Last-Modified indican el idenfier único del archivo o la última marca de tiempo modificada en el recurso detrás del URI de solicitud.

Si esos encabezados están presentes en la respuesta, puede solicitar una parte del recurso utilizando los encabezados de solicitud If-Range y Range con el identificador único de archivo o la última marca de tiempo modificada y el rango de bytes deseado, respectivamente.

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

El ejemplo anterior devuelve los primeros 100 bytes del archivo.


la operación HEAD, tal como se define en el estándar HTTP, no devuelve ningún contenido aparte de la información del encabezado. Por lo tanto, si envía una solicitud principal, solo puede inspeccionar el tipo MIME del archivo desde el encabezado de respuesta HTTP.

La información del encabezado se puede obtener mirando la Representación devuelta al envolverlo en un ClientResource y realizar una solicitud principal. Esto le proporciona una interfaz de alto nivel para el transporte HTTP y no necesita hacer un análisis de encabezado personalizado.

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

Si desea hacer un tipo de contenido adivinando el contenido real del archivo, tendrá que descargar el contenido real, por ejemplo, con una solicitud GET en contra de ese recurso.

O en modo REST real, podría modelar un parámetro de consulta adicional para su recurso que devolvería su metainformación personalizada para ese archivo, por ejemplo

http://server/file?contentType

De manera similar, para recuperar el contenido real, puede obtener un control sobre el flujo y luego hacer su adivinación de codificación.

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

Para especificar rangos, si el servidor lo admite, puede establecer los rangos antes de enviar su solicitud de obtención.

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 consumir la respuesta (transmisión) por completo, antes de regresar.

Sugiero que busque otros esfuerzos que lo ayuden a determinar el tipo de contenido. Me gusta aquí Java charset y Windows O http://glaforge.free.fr/wiki/index.php?wiki=GuessEncoding