Это на самом деле не должно происходить. Загрузка считается как отдельный запрос , который должен выполняться в фоновом режиме независимо от родительской страницы после ее вызова. Как именно вы запускаете запрос на загрузку? По простой ванильной ссылке или по ссылке, которая (неправильно) запускает аксиальный запрос на запуск загрузки?
В любом случае, вы хотя бы явно хотите иметь возможность возобновить загрузок. В этом случае вам необходимо отправить как минимум соответственно заголовки ответов Accept-Ranges
, ETag
и Last-Modified
. Затем клиент может попросить возобновить загрузку, отправив заголовки запроса If-Range
и Range
с соответствующим идентификатором файла и указанным диапазоном байтов, который можно использовать в сочетании с RandomAccessFile
для отправки оставшихся байтов. Вы можете найти больше информации и образец сервлета в этой статье .
Это теория. В вашем конкретном случае это немного сложнее, поскольку вы архивируете файлы на лету. Вам нужно сначала записать zip-архив во временную папку файловой системы локального диска сервера, а затем из него выполнить потоковую передачу и, наконец, удалить файл только после успешного завершения загрузки (т. Е. out.close()
didn Выкинуть IOException
). Вы можете идентифицировать связанный zip-файл с помощью параметра запроса или pathinfo или, возможно, ключа в сеансе.
Обновление : согласно вашему обновлению: я, честно говоря, не знаю, и никогда не испытывал этого, но, по крайней мере, могу сказать, что вы не единственный, кто пострадал от эта проблема . По крайней мере, реализация возможностей возобновления, как описано выше, может быть решением этой конкретной проблемы, поскольку Firefox автоматически возобновит загрузку, не дергая за неполную часть.
Обновление 2 : после того, как вы немного подумали после прочтения вашего обновления и поведения браузера, похоже, что между запуском фактического запроса и получением заголовков ответа существует довольно большой промежуток времени. Я не знаю точных деталей, как вы загружаете файлы, но похоже на то, что сбор ZIP-файлов требует времени (может быть, вы загружаете их из сетевой файловой системы или базы данных заранее? ) и что вы устанавливаете / отправляете заголовки ответа только после , когда вы собрали все ZIP-файлы. Попробуйте установить заголовки и выполнить output.flush()
перед выполнением дорогостоящей задачи. Таким образом, браузер получит заголовки как можно скорее, и он будет знать, чего он может ожидать.