2011-12-17 2 views
11

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

+3

Почему назвать это изменой? – Nonym

+0

Несмотря на глупый титул, я думаю, что это довольно хороший вопрос. Да, это «возможно». Однако объем требуемой работы не является тривиальным ... для конечного пользователя это «невозможно» (если кто-то уже не создал такой инструмент). –

+0

(Поскольку нет тега языка программирования, я полагаю, что нет никакого желания на самом деле кодировать такое решение :-) –

ответ

7

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

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

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

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

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

+0

Интересно, есть ли библиотека, которая может отображать запросы диапазона содержимого HTTP как своего рода извращенный поток IO ... :) (На самом деле было бы возможно [fsvo], как описано, для ряда языков, которые принимают потоковые входы Не то, к чему я хочу прикоснуться.) –

+1

Это не взлом, а способ правильной работы. Фактически, HTTP здесь становится просто способом доступа к ZIP-потоку, и любой ZIP-компонент, который работает с потоками, может быть использован для извлечения только одного файла из удаленного потока. –

+0

@ EugeneMayevski'EldoSorp Да, вы, вероятно, правы, я не смотрел на это так :-) –

0

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

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

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

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

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

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

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

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

+0

Хорошее расширение моей идеи пользовательского сервера. Спасибо :-) –

+0

@SergeiTulentsev Я соблазн написать клиент, как вы описали :) –

+0

у вас есть много свободного времени, а? :-) Но да, я тоже искушаю :-) –

0

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

+1

Какой трюк. Легко и эффективно. Для архива с параметрами url, содержащими параметры, не забудьте указать их. –

+0

Кажется, что больше не работает ... [Пример] (https://docs.google.com/viewer?url=http://www.colorado.edu/conflict/peace/download/peace.zip) – boramalper

+0

Хотя это может быть ценным советом для решения проблемы, хороший ответ также демонстрирует решение. Пожалуйста, [править], чтобы предоставить пример кода, чтобы показать, что вы имеете в виду. В качестве альтернативы подумайте о том, чтобы вместо этого писать это как комментарий. –

1

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

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

+0

Хотя эта ссылка может ответить на вопрос, лучше включить здесь основные части ответа и предоставить ссылку для справки. Ответные ссылки могут стать недействительными, если связанная страница изменится. - [Из обзора] (/ review/low-quality-posts/18749488) – aerokite

+0

Это инструмент, а не код или фреймворк. Этот сайт не о поиске программ, а о создании их. – kelin

10

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

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

Get/построить 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 

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

$ 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 настроен таким образом на моей машине, вам не нужно будет это делать)

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

3

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

+0

Интересно, если частичный zip работал для вас. Для меня это похоже на приятное обещание, которое ничего мне не принесло. –

+0

Хотя эта ссылка может ответить на вопрос, лучше включить здесь основные части ответа и предоставить ссылку для справки. Ответные ссылки могут стать недействительными, если связанная страница изменится. - [Из обзора] (/ review/low-quality-posts/18749491) – blue112

0

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

Скачать 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 
Смежные вопросы