Создание переменной zip-архива "на лету", оценка размера файла для длины контента

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

Я изменил это сейчас, используя веб-api и push-поток, чтобы напрямую генерировать архив "на лету". Мой код предлагает динамически zip, zip64 или .tar.gz, в зависимости от оценочной файловой системы и операционной системы. По соображениям производительности сжатие ist установлено на лучшую скорость ( "none" сделает zip-архивы несовместимыми с Mac OS, используемая мной библиотека gzip не предлагает ничего).

Пока все работает отлично, однако при загрузке файла пользователь больше не имеет индикатор выполнения, потому что я не настраиваю длину содержимого. Каковы наилучшие способы обойти это? Я попытался угадать результирующий размер файла, но оба браузера отменяют загрузки до раннего или останавливаются на 99, x% и ждут пропавших байтов, что приводит к разнице между оценочным и фактическим размером файла.

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

Я видел много файловых хостеров, предлагающих возможность выбирать файлы из папки и помещать их в zip файл, и все они имеют правильный (?) размер файла с ними и индикатор выполнения. Любые лучшие практики? Спасибо!

Ответ 1

Это лишь некоторые мысли, возможно, вы можете их использовать:)

Используя Web API/HTTP, обычным способом является то, что ответ содержит длину файла. Поскольку ответ сначала получен после завершения вызова, фактическое время для создания файла не будет показывать индикатор выполнения в любом браузере, кроме курсора ожидания Windows.

Что вы можете сделать, это использовать двухэтапный подход.

Создание zip файла Создайте дуплексный канал, используя SignalR, чтобы дать отзыв о генерации файла.

Загрузка zip файла После создания файла вы должны знать размер файла, и при загрузке браузер отобразит индикатор выполнения.

Ответ 2

Похоже, эта проблема должна была быть решена с использованием расширений chunk, но, похоже, она никогда не достигала draft.

Итак, я думаю, вы застряли либо без прогресса, либо с отправкой размера файла вперед.

Кажется, что создание точных размеров zip архивов сложнее, чем добавление нулевого заполнения.

Другим вариантом может быть предварительно создать файл zip, не сохраняя его только для определения размера.

Но мне просто интересно, почему бы просто не использовать tar? У него нет сжатия, поэтому легко определить его окончательный размер спереди от размера отдельных файлов, и он также должен поддерживаться как OSx и Linux. И Windows должна иметь возможность обрабатывать сжатые zip-архивы, поэтому подобный трюк также может работать.