Что произойдет, если указанный размер потоковой загрузки окажется неточным?
Я реализовал в своем проекте django представление загрузки, которое собирает zip-архив и передает его на лету.
В архив входят 1 файл tsv
и любое количество файлов xml
(из набора результатов поиска), которые организованы в ряд каталогов.
Загрузка работает, но прогресса нет. Мы протестировали небольшую загрузку (47 Мб) и большую (3 Гб).
Я подумал, что было бы неплохо иметь индикатор выполнения, чтобы дать пользователю некоторое представление о том, сколько времени займет загрузка, однако, из того, что я читал, предсказать размер zip-файла сложно/неточно, поэтому мне интересно (поскольку я очень неопытен в создании zip-файлов [не говоря уже о потоковой загрузке])...
- Что произойдет с загрузкой с точки зрения пользователя, если я укажу приблизительный размер? В частности, не произойдет ли загрузка?
- Что произойдет, если предполагаемый размер окажется слишком большим?
- Что произойдет, если предполагаемый размер будет слишком мал?
Есть ли альтернативные решения для этого проблемного пространства, которые я должен рассмотреть?
Чтобы получить прогресс, вам нужно отправить заголовок Content-Length в ответ, а вы не можете отправить его при потоковых запросах, так как вы не знаете точный размер ответа до начала потоковой передачи.
ОК, что же произойдет, если мы оценим Content-Length:
- Если она меньше реальной длины, запрос будет прерван раньше времени. так как с точки зрения браузера все данные получены.
- Если значение больше реальной длины, то браузер будет продолжать ожидать содержимое, которое никогда не будет получено, так как его нет.
Решением является выполнение всей работы сначала на сервере, так что вы отправляете файл сразу (возможно, с заданной длиной содержимого), но, конечно, это может вызвать Gateway Timeout, если вы сжимаете в течение длительного времени.
На самом деле можно заранее предсказать длину Zip-архива. If :
- вы знаете размеры и имена всех входных файлов,
- вы отключили сжатие,
- вы точно знаете, как библиотека Zip интерпретирует формат Zip.
Я сделал это в client-zip именно для того, чтобы включить прогресс-бары и устранить необходимость в кодировании в виде кусков. Я не знаю, есть ли что-то эквивалентное в Python (или где-либо еще).