Мне было интересно, есть ли способ, по которому я могу загрузить только часть файла .rar или .zip без скачивания всего файла? Существует zip-файл, содержащий файлы A, B, C и D. Мне нужен только я. Могу ли я как-то изменить настройку для загрузки только A или, если возможно, извлечь файл на сервере и получить только A?Можно ли загрузить только часть ZIP-архива (например, один файл)?
ответ
В некотором смысле, да, вы можете.
ZIP file format говорит, что существует «центральный каталог». В принципе, это таблица, в которой хранятся файлы, хранящиеся в архиве, и какие у них есть.
Таким образом, используя Content-Range, вы можете загрузить часть файла с конца (центральный каталог - это последнее в zip-файле) и попытаться определить в нем центральный каталог. Если вы преуспеете, то вы знаете список файлов и смещения, чтобы вы могли продолжить и разделить эти куски и самостоятельно распаковать их.
Этот подход довольно подвержен ошибкам и не гарантированно работает. Но так же взломать в целом :-)
Другим возможным подходом было бы создание для этого настраиваемого сервера (подробнее см. @pst's answer).
Интересно, есть ли библиотека, которая может отображать запросы диапазона содержимого HTTP как своего рода извращенный поток IO ... :) (На самом деле было бы возможно [fsvo], как описано, для ряда языков, которые принимают потоковые входы Не то, к чему я хочу прикоснуться.) –
Это не взлом, а способ правильной работы. Фактически, HTTP здесь становится просто способом доступа к ZIP-потоку, и любой ZIP-компонент, который работает с потоками, может быть использован для извлечения только одного файла из удаленного потока. –
@ EugeneMayevski'EldoSorp Да, вы, вероятно, правы, я не смотрел на это так :-) –
Думаю, идея Сергея Туленцева блестящая.
Однако, если есть контроль над сервером - например, пользовательский код может быть развернут - тогда это довольно тривиальная операция (в схеме вещей :) для сопоставления/обработки запроса, извлечения соответствующей части ZIP-архива и отправки данных обратно в потоке HTTP.
Запрос может выглядеть следующим образом:
http://foo.bar/myfile.zip_a.jpeg
Что будет означать экстракт - и вернуться - "a.jpeg" от "myfile.zip".
(я намеренно выбрал этот глупый формат так, что браузеры, скорее всего, выбрать «myfile.zip_a.jpeg» в качестве имени в диалоговом окне загрузки, когда он появляется.)
Конечно, как это реализуется, зависит на сервере/языке/структуре, и уже могут существовать существующие решения, поддерживающие аналогичную операцию (но я не знаю).
Счастливое кодирование.
Хорошее расширение моей идеи пользовательского сервера. Спасибо :-) –
@SergeiTulentsev Я соблазн написать клиент, как вы описали :) –
у вас есть много свободного времени, а? :-) Но да, я тоже искушаю :-) –
Вместо этого используйте устройство Google Docs. Перейдите по этой ссылке - https://docs.google.com/viewer?url=http://file.zip и измените адрес zip-файла. Он может открывать как файлы zip, так и rar.
Какой трюк. Легко и эффективно. Для архива с параметрами url, содержащими параметры, не забудьте указать их. –
Кажется, что больше не работает ... [Пример] (https://docs.google.com/viewer?url=http://www.colorado.edu/conflict/peace/download/peace.zip) – boramalper
Хотя это может быть ценным советом для решения проблемы, хороший ответ также демонстрирует решение. Пожалуйста, [править], чтобы предоставить пример кода, чтобы показать, что вы имеете в виду. В качестве альтернативы подумайте о том, чтобы вместо этого писать это как комментарий. –
Вы можете использовать FDM, это поддержка частичной загрузки файлов Zip: Free Download Manager позволяет загружать только необходимую часть zip-файла.
Хотя эта ссылка может ответить на вопрос, лучше включить здесь основные части ответа и предоставить ссылку для справки. Ответные ссылки могут стать недействительными, если связанная страница изменится. - [Из обзора] (/ review/low-quality-posts/18749488) – aerokite
Это инструмент, а не код или фреймворк. Этот сайт не о поиске программ, а о создании их. – kelin
Хитрость заключается в том, чтобы делать то, что Серхио предлагает не делать это вручную. Это легко, если вы монтируете 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 настроен таким образом на моей машине, вам не нужно будет это делать)
Я знаю, что это старый вопрос, это для других, сталкивающихся с этой проблемой ,
Есть несколько способов, которыми нормальный человек может загрузить отдельный файл из сжатого ZIP-файла, к сожалению, они не являются общеизвестными. Есть несколько инструментов с открытым кодом и онлайновые веб-сервисы, в том числе:
- Windows: (!, Что я использовал в течение более 10 лет) Iczelion's HTTP Zip Dowloader (open-source)
- Linux: partial-zip (open-source)
- Интернет: wobzip.org (closed-source)
Интересно, если частичный zip работал для вас. Для меня это похоже на приятное обещание, которое ничего мне не принесло. –
Хотя эта ссылка может ответить на вопрос, лучше включить здесь основные части ответа и предоставить ссылку для справки. Ответные ссылки могут стать недействительными, если связанная страница изменится. - [Из обзора] (/ review/low-quality-posts/18749491) – blue112
Можете ли вы организовать, чтобы ваш файл появлялся в задней части почтового индекса?
Скачать 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
- 1. Можно ли загрузить только одну часть файла (например, первые 100 КБ) в C#?
- 2. Можно ли загрузить один конкретный файл с localhost?
- 3. Можно ли окрасить только часть JTextpane?
- 4. Можно ли загрузить только тег HEAD страницы?
- 5. Можно ли только удалить часть шаблона
- 6. Можно ли изменить только часть TextView?
- 7. Z3: Можно ли упростить только часть утверждений?
- 8. Можно ли отобразить только часть массива? (Array.map())
- 9. Можно ли выделить только часть изображения (непрозрачность)?
- 10. Можно ли загрузить часть файла svg с помощью snap.svg?
- 11. Можно ли загружать только часть страницы с помощью colorbox?
- 12. Можно ли вытащить только один файл в Git?
- 13. Можно ли запускать javascript только один раз?
- 14. Можно ли переопределить только один фильтр авторизации?
- 15. Можно ли загрузить двоичный файл из JSP?
- 16. Можно ли отделить части (например, барабанную часть) от полной песни?
- 17. Можно ли синхронизировать один файл с s3?
- 18. Можно ли загрузить файл Excel в память?
- 19. Как загрузить только часть страницы?
- 20. Загрузить структурированный файл данных текста, используя только один файл управления
- 21. Можно ли загрузить ipa-файл из TestFlight?
- 22. Можно ли загрузить файл php без селектора?
- 23. Bind атрибут только один раз (например, bindonce)
- 24. Можно ли строить стручки только один раз?
- 25. Можно ли повторять итераторы только один раз?
- 26. Можно ли выполнить метод только один раз?
- 27. Могу ли я загрузить только часть страницы без java-скрипта?
- 28. Можно ли загрузить + визуализировать файл html.erb в другой файл html.erb?
- 29. Можно ли принудительно загрузить файл (например, pdf) сразу после загрузки страницы
- 30. C# - как загрузить только измененную часть HTML
Почему назвать это изменой? – Nonym
Несмотря на глупый титул, я думаю, что это довольно хороший вопрос. Да, это «возможно». Однако объем требуемой работы не является тривиальным ... для конечного пользователя это «невозможно» (если кто-то уже не создал такой инструмент). –
(Поскольку нет тега языка программирования, я полагаю, что нет никакого желания на самом деле кодировать такое решение :-) –