Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

Фокус в том, чтобы сделать то, что предлагает Серхио, не делая этого вручную. Это легко, если вы монтируете zip файл через виртуальную файловую систему с поддержкой HTTP, а затем используйте стандартную команду unzip. Таким образом, вызовы ввода-вывода 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 настроен таким образом на моей машине, вам не нужно будет этого)

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

Ответ 2

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

Формат ZIP файла говорит о наличии "центрального каталога". В принципе, это таблица, в которой хранятся файлы, хранящиеся в архиве, и какие значения они имеют.

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

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

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

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

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

Запрос может выглядеть так:

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

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

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

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

Счастливое кодирование.

Ответ 6

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

Ответ 7

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

Загрузить 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