2011-12-17 16 views
11

Me preguntaba ¿hay alguna manera de poder descargar solo una parte de un archivo .rar o .zip sin descargar todo el archivo? Hay un archivo zip que contiene los archivos A, B, C y D. Solo necesito A. ¿Puedo de alguna manera modificar la descarga para descargar solo A o extraer el archivo en el servidor y obtener A solo?¿Es posible descargar solo parte de un archivo ZIP (por ejemplo, un archivo)?

+3

Por qué lo llaman una traición? – Nonym

+0

A pesar del título tonto, creo que es una buena pregunta. Si es posible". Sin embargo, la cantidad de trabajo requerido no es trivial ... para el usuario final no es "factible" (a menos que alguien ya haya creado dicha herramienta). –

+0

(Debido a que no existe una etiqueta de lenguaje de programación, imagino que no existe el deseo de codificar una solución como esta :-) –

Respuesta

7

En cierto modo, sí, puede.

ZIP file format dice que hay un "directorio central". Básicamente, esta es una tabla que almacena qué archivos están en el archivo y qué compensaciones tienen.

Por lo tanto, usando Content-Range puede descargar parte del archivo del final (el directorio central es lo último en el archivo zip) y tratar de identificar el directorio central en el mismo. Si tiene éxito, entonces conoce la lista de archivos y las compensaciones, por lo que puede continuar y obtener esos fragmentos por separado y descomprimirlos usted mismo.

Este enfoque es bastante propenso a errores y no se garantiza que funcione. Pero también lo es el pirateo en general :-)

Otro posible enfoque sería crear un servidor personalizado para eso (ver @pst's answer para más detalles).

+0

Me pregunto si hay una biblioteca que pueda mapear las solicitudes de rango de contenido HTTP como un tipo de flujo perverso IO ... :) (En realidad, sería posible [fsvo], como se describe, para varios idiomas que aceptan entradas de flujo . No es algo que quisiera tocar.) –

+1

Esto no es piratería sino la forma de hacer la tarea bien. En realidad, HTTP aquí se convierte en solo una forma de acceder a la secuencia ZIP, y cualquier componente ZIP que funcione con secuencias se puede utilizar para extraer solo un archivo de la transmisión remota. –

+0

@ EugeneMayevski'EldoSCorp Sí, probablemente tienes razón, no lo vi de esta manera :-) –

0

Creo que la idea de Sergei Tulentsevs es brillante.

Sin embargo, si hay control sobre el servidor, p. se puede implementar un código personalizado, entonces es una operación bastante trivial (en el esquema de cosas :) mapear/manejar una solicitud, extraer la parte relevante del archivo ZIP, y enviar los datos de vuelta en la secuencia HTTP.

La solicitud podría ser:

http://foo.bar/myfile.zip_a.jpeg 

Lo que significaría extracto - y regresar - "a.jpeg" de "myfile.zip".

(I eligió intencionadamente este formato tonto para que los navegadores es probable elegir "myfile.zip_a.jpeg" como nombre en el diálogo de descarga cuando aparece.)

Por supuesto, cómo se implementa esto depende en el servidor/idioma/marco y es posible que ya existan soluciones existentes que admitan una operación similar (pero no lo sé).

Happy coding.

+0

Agradable expansión de mi idea de servidor personalizado. Gracias :-) –

+0

@SergeiTulentsev Tengo la tentación de escribir un cliente como el que describiste :) –

+0

tienes mucho tiempo libre, ¿eh? :-) Pero sí, estoy tentado también :-) –

0

En su lugar, utilice el lector de Google Docs. Vaya a este enlace: https://docs.google.com/viewer?url=http://file.zip y cambie la dirección del archivo comprimido. Puede abrir archivos zip y rar

+1

¡Qué truco! Fácil y eficiente Para archivar con url que contiene parámetros, no olvide urlencode them. –

+0

Parece que ya no funciona ... [Ejemplo] (https://docs.google.com/viewer?url=http://www.colorado.edu/conflict/peace/download/peace.zip) – boramalper

+0

Si bien esto podría ser una pista valiosa para resolver el problema, una buena respuesta también demuestra la solución. Por favor [edite] para proporcionar un código de ejemplo para mostrar lo que quiere decir. Alternativamente, considere escribir esto como un comentario en su lugar. –

1

Puede usar FDM, es compatible con la descarga parcial de archivos Zip: Free Download Manager le permite descargar solo la parte necesaria de un archivo comprimido.

http://www.freedownloadmanager.org/features.htm

+0

Si bien este enlace puede responder la pregunta, es mejor incluir las partes esenciales de la respuesta aquí y proporcionar el enlace de referencia. Las respuestas de solo enlace pueden dejar de ser válidas si la página vinculada cambia. - [De la opinión] (/ review/low-quality-posts/18749488) – aerokite

+0

Es una herramienta, no un código o marco. Este sitio no se trata de buscar programas, se trata de crearlos. – kelin

10

El truco es hacer lo que sugiere Sergio sin hacerlo manualmente. Esto es fácil si monta el archivo zip a través de un sistema de archivos virtual respaldado por HTTP y luego usa el comando descomprimir estándar en él. De esta forma, las llamadas de E/S de la utilidad de descompresión se traducen al alcance HTTP, lo que significa que solo los fragmentos del archivo zip que desea se transfieren a través de la red.

Aquí hay un ejemplo para Linux que usa HTTPFS, un sistema de archivos virtual muy liviano (usa FUSE). Hay herramientas similares para Windows.

Obtener/construir httpfs:

$ wget http://sourceforge.net/projects/httpfs/files/httpfs/1.06.07.02 
$ tar -xjf httpfs_1.06.07.10.tar.bz2 
$ rm httpfs 
$ ./make_httpfs 

monte un archivo zip remoto y extraer un archivo de él:

$ mkdir mount_pt 
$ sudo ./httpfs http://server.com/zipfile.zip mount_pt 
$ sudo ls mount_pt 
zipfile.zip 
$ sudo unzip -p mount_pt/zipfile.zip the_file_I_want.txt > the_file_I_want.txt 
$ sudo umount mount_pt 

Por supuesto también se puede utilizar cualquier otras herramientas al lado de la Línea de comando uno. (Necesito sudo porque parece que FUSE está configurado de esa manera en mi máquina, no debería tener que necesitarlo)

Soy consciente de que esta es una vieja pregunta, esto es para otros que tengan este problema .

3

Existen varias maneras para que una persona normal pueda descargar un archivo individual desde un archivo ZIP comprimido, desafortunadamente no son de conocimiento común. Hay algunas herramientas de código abierto y servicios web en línea, incluyendo:

+0

Me pregunto, si zip parcial funcionó para usted. Para mí, parece una buena promesa, que no me entregó nada. –

+0

Si bien este enlace puede responder la pregunta, es mejor incluir las partes esenciales de la respuesta aquí y proporcionar el enlace de referencia. Las respuestas de solo enlace pueden dejar de ser válidas si la página vinculada cambia. - [De la crítica] (/ reseña/mensajes de baja calidad/18749491) – blue112

0

¿Puede organizar que su archivo aparezca en la parte posterior del código postal?

Descargar 100k:

$ curl -r -100000 https://www.keepassx.org/releases/2.0.2/KeePassX-2.0.2.zip -o tail.zip 
% Total % Received % Xferd Average Speed Time Time  Time Current 
          Dload Upload Total Spent Left Speed 
100 97k 100 97k 0  0 84739  0 0:00:01 0:00:01 --:--:-- 84817 

comprobar qué archivos nos hicieron llegar:

$ unzip -t tail.zip 
    (please check that you have transferred or created the zipfile in the 
    appropriate BINARY mode and that you have compiled UnZip properly) 
error [tail.zip]: attempt to seek before beginning of zipfile 
    (please check that you have transferred or created the zipfile in the 
    appropriate BINARY mode and that you have compiled UnZip properly) 
error [tail.zip]: attempt to seek before beginning of zipfile 
    (please check that you have transferred or created the zipfile in the 
    appropriate BINARY mode and that you have compiled UnZip properly) 
error [tail.zip]: attempt to seek before beginning of zipfile 
    (please check that you have transferred or created the zipfile in the 
    appropriate BINARY mode and that you have compiled UnZip properly) 
error [tail.zip]: attempt to seek before beginning of zipfile 
    (please check that you have transferred or created the zipfile in the 
    appropriate BINARY mode and that you have compiled UnZip properly) 
    testing: KeePassX-2.0.2/share/translations/keepassx_uk.qm OK 
    testing: KeePassX-2.0.2/share/translations/keepassx_zh_CN.qm OK 
    testing: KeePassX-2.0.2/share/translations/keepassx_zh_TW.qm OK 
    testing: KeePassX-2.0.2/zlib1.dll OK 
At least one error was detected in tail.zip. 

A continuación, extraer el último archivo:

$ unzip tail.zip KeePassX-2.0.2/zlib1.dll 
Archive: tail.zip 
error [tail.zip]: missing 7751495 bytes in zipfile 
    (attempting to process anyway) 
    inflating: KeePassX-2.0.2/zlib1.dll 
Cuestiones relacionadas