Как заставить браузер скачать файл?
Я сталкиваюсь с проблемой при попытке заставить браузер скачать большие файлы. Все работает хорошо для небольших файлов, примерно до 1MB, но когда я пробую отправить файлы размером около 20MB, браузер начинает их отображать вместо того, чтобы предложить скачать. Я перепробовал множество заголовков, и вот мой текущий код:
PrintWriter out = response.getWriter();
String fileName = request.getParameter("filename");
File f = new File(fileName);
InputStream in = new FileInputStream(f);
BufferedInputStream bin = new BufferedInputStream(in);
DataInputStream din = new DataInputStream(bin);
while (din.available() > 0) {
out.print(din.readLine());
out.print("\n");
}
response.setContentType("application/force-download");
response.setContentLength((int) f.length());
response.setHeader("Content-Transfer-Encoding", "binary");
response.setHeader("Content-Disposition", "attachment; filename=\"" + "xxx\""); // fileName);
in.close();
bin.close();
din.close();
Как я могу заставить браузер принудительно загрузить большие файлы, а не отображать их?
2 ответ(ов)
Установите заголовок Content-Type и другие заголовки перед тем, как вы начнете записывать файл. Для небольших файлов содержимое кэшируется, и браузер сначала получает заголовки. Для больших файлов данные передаются первыми.
Это фрагмент PHP-скрипта, который корректно решает проблему во всех браузерах, которые я тестировал (Firefox начиная с 3.5, IE8+, Chrome):
header("Content-Disposition: attachment; filename=\"".$fname_local."\"");
header("Content-Type: application/force-download");
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".filesize($fname));
На основании этого, могу сказать, что вы делаете все правильно. Проверяли ли вы настройки вашего браузера?
В чем разница между JSF, Servlet и JSP?
Как распределяются потоки для обработки запросов Servlet?
Как работают сервлеты? Инстанцирование, сессии, общие переменные и многопоточность
В чем разница между JPA и Hibernate? [закрыт]
Создание репозитория Spring без сущности