Мне было интересно, есть ли способ, по которому я могу загрузить только часть файла .rar или .zip без скачивания всего файла? Существует zip файл, содержащий файлы A, B, C и D. Мне только нужно. Могу ли я каким-то образом настроить файл для загрузки только A или, если возможно, извлечь файл на сервере и получить только A?
Можно ли загружать только часть ZIP-архива (например, один файл)?
Ответ 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 файла, к сожалению, они не являются общеизвестными. Есть некоторые инструменты с открытым исходным кодом и онлайн-сервисы, в том числе:
- Windows: Iczelion HTTP Zip Dowloader (с открытым исходным кодом) (который я использовал более 10 лет!)
- Linux: partial-zip (open-source)
- Онлайн: wobzip.org(закрытый источник)
Ответ 4
Вы можете использовать FDM, он поддерживает частичную загрузку файлов Zip: Free Download Manager позволяет загружать только необходимую часть zip файла.
Ответ 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