Возможно ли «потоковое» скачивание множества файлов с сайта?
Всем доброго дня.
Есть сайт, на нем довольно много фотографий (более 400Гб в среднем вес одной - 300Кб). Пользователь имеет возможность просматривать часть из них. Ему нужна возможность скачать выбранные фото на себе комп.
Конечно, старый добрый вариант, это формирование архива, но есть несколько проблем:
1. фоток может быть очень много - за 1 раз до 14Гб;
2. не все пользователи имеют возможность открывать архивы (ввиду политик безопасности);
3. нагрузка на сервер в момент формирования.
По этому и возник вопрос - возможно каким то образом инициировать скачивания массива фотографий, чтобы пользователь выбрал папку и далее с сервера пошла в нее заливка выбранных ранее фотографий?
Прошу ссылочки на литературу, подсказки или варианты альтернативного решения задачи.
Заранее спасибо!
Политики безопасности мешают открывать архивы? Каким же образом?
1. Есть файл в каталоге "downloads" доступный на чтение (наш архив).
2. Есть архиватор zip в системе.
3. Есть каталог "downloads" доступный на запись.
Что мешает распаковать этот архив в каталог?
biovr добрый день! так если архив в zip, то стандартны проводник Windows его спокойно открывает, не нужен сторонний архиватор. Или у пользователей может стоять ОС, отличная от Windows?
Можно использовать TAR в качестве архива. Это дает:
Нулевую дополнительную нагрузку на сервер по причине отсутствия компрессии.
Возможность программно писать такой "архив" на лету прямо в открытое tcp соединение (со вставкой HTTP-заголовков в начале).
Возможно даже написать докачку архива после обрыва соединения через "206 Partial Content" и "Content-Range:", также на лету, мгновенно, без переборки архива от начала. Это нетривиальная задача, но вполне решаемая.
nirvimel: не подскажите ссылочки на материалы, где можно почитать про "Возможность программно писать такой "архив" на лету прямо в открытое tcp соединение (со вставкой HTTP-заголовков в начале)"?
Я правильно понимаю, что это возможность не формировать сам файл на сервере, а именно формирование в кеше?
biovr: Ссылка на википедию в моем ответе, там описан формат заголовков. TAR - на самом деле, элементарный формат (гораздо проще HTTP протокола, например) состоит из 512-байтных секторов. 1-ый сектор под заголовки (имя файла, атрибуты), за ним содержимое файла, выровненное по границе 512 байт, за ним следующий файл...
Задача вашего сервера - читать по одному файлы с диска блоками (по несколько сотен килобайт) и писать их в отрытое соединение (куда вы пишите Response сервера, не знаю как это в ASP.NET называется). Расход памяти при этом составит те самые несколько сотен килобайт и никаких кешей (не считая кеш ОС).
biovr: Дисковый кеш ОС - проблемы ОС, она лучше знает как им пользоваться. Расходоваться он будет точно так же как при любом последовательном чтении всех этих картинок в любых целях.
Как насчет создать торрент? Лично у меня есть "плохая" идея. По выбранному списку файлов формировать GET-запросы на каждое изображение отдельно. Из соображений безопасности - вас из браузера не пустят в файловую систему, а запросить скачивание могут и из закрытых систем. Так что все файлики полетят в какой-нибудь DownLoads. Всеже архив - самое адекватное решение. Можете покопать сокеты или SignalR. Возможно они умеют возвращать файло.
Иван: да. т.к. некоторым не понятно: каждой учетной записи выдаются права на доступ к выбранным файлам(например при установке галочки в веб интерфейсе). затем файлы автоматически отображаются на подмонтированном через webdav сетевом диске у пользователя. пример реализации - яндекс диск через webdav. смысла городить автоматическое скачивание файлов нет.
123459: такой вариант не очень удобен - надо связывать базу с webdav и т.д. Да и не очень хочется, чтобы у юзеров висели внешние диски к серверу.
а как яндекс это делает? там же можно выбрать файлы и скачать их - наверняка технология довольно продвинутая.
biovr: habrahabr.ru/company/yandex/blog/173343 диск только один, в нём отображаются виртуальные папки. в крайнем случае, можете создать синхронизационное приложение, которое будет синхронизировать структуру из web интерфейса с выбранной папкой на локальном диске, как это делают клиенты облачных дисков.