Можно ли загрузить только часть ZIP-архива (например, один файл)? - PullRequest
15 голосов
/ 17 декабря 2011

Мне было интересно, есть ли способ, с помощью которого я могу загрузить только часть файла .rar или .zip без загрузки всего файла?Существует zip-файл, содержащий файлы A, B, C и D. Мне нужен только A. Могу ли я каким-то образом настроить загрузку, чтобы загрузить только A, или, если возможно, извлечь файл на самом сервере и получить только A?

Ответы [ 7 ]

11 голосов
/ 10 марта 2013

Хитрость заключается в том, чтобы делать то, что предлагает Серхио, не делая это вручную.Это легко, если вы монтируете zip-файл через виртуальную файловую систему с HTTP-поддержкой, а затем используете стандартную команду unzip.Таким образом, вызовы ввода-вывода утилиты распаковки преобразуются в диапазон HTTP, что означает, что только фрагменты zip-файла, которые вы хотите, передаются по сети.

Вот пример для Linux, использующего HTTPFS , очень легкая виртуальная файловая система (использует FUSE).Для Windows существуют аналогичные инструменты.

Получить / построить 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 

Смонтировать удаленный zip-файл и извлечь из него один файл:

$ 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 

Конечно, вы также можете использовать любые другие инструменты, кроме командной строки.(Мне нужен sudo, потому что кажется, что FUSE настроен таким образом на моей машине, вам это не нужно)

Я знаю, что это старый вопрос, это для других, сталкивающихся с этимпроблема.

7 голосов
/ 17 декабря 2011

В некотором смысле, да, вы можете.

Формат файла ZIP говорит, что существует «центральный каталог».По сути, это таблица, в которой хранятся файлы в архиве и их смещения.

Таким образом, используя Content-Range , вы можете загрузить часть файла с конца (центральныйдиректория - это последнее, что находится в zip-файле), и попытайтесь определить центральный каталог в нем.Если вам это удастся, вы знаете список файлов и смещения, так что вы можете продолжить и получить эти блоки отдельно и распаковать их самостоятельно.

Этот подход довольно подвержен ошибкам и не гарантированно будет работать.Но в общем, взлом также: -)

Другой возможный подход - создать для этого собственный сервер (подробности см. В ответе @ pst ).

3 голосов
/ 05 сентября 2013

У обычного человека есть несколько способов загрузить отдельный файл из сжатого ZIP-файла, к сожалению, он не является общеизвестным. Существует несколько инструментов с открытым исходным кодом и онлайн-сервисов, в том числе:

1 голос
/ 14 февраля 2013

Вы можете использовать FDM, он поддерживает частичную загрузку Zip-файлов: Free Download Manager позволяет загружать только необходимую часть zip-файла.

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

0 голосов
/ 11 июля 2016

Можете ли вы сделать так, чтобы ваш файл отображался в конце почтового индекса?

Скачать 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

Проверьте, какие файлы мы получили:

$ 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.

Затем извлеките последний файл:

$ 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  
0 голосов
/ 29 июля 2012

Вместо этого используйте читатель Google Docs. Перейдите по этой ссылке - https://docs.google.com/viewer?url=http://file.zip и измените адрес zip-файла. Может открывать как zip, так и rar файлы

0 голосов
/ 17 декабря 2011

Я думаю, что идея Сергея Туленцева блестящая.

Однако, если есть контроль над сервером - например, пользовательский код может быть развернут - тогда это довольно тривиальная операция (в схеме вещей:) для сопоставления / обработки запроса, извлечения соответствующей части ZIP-архива и отправки данных обратно в поток HTTP.

Запрос может выглядеть следующим образом:

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

Что будетозначает извлечь - и вернуть - "a.jpeg" из "myfile.zip".

(Я специально выбрал этот глупый формат, чтобы браузеры, вероятно, выбрали "myfile.zip_a.jpeg" в качестве именидиалоговое окно загрузки, когда оно появляется.)

Конечно, как это реализовано, зависит от сервера / языка / инфраструктуры, и, возможно, уже существуют решения, поддерживающие аналогичную операцию (но яне знаю).

Удачного кодирования.

...