Основные идеи:
Предыдущая идея состояла в том, чтобы вспомнить коробку, чтобы спросить пользователя, где он хотел сохранить файл, а затем я сгенерировал другой файл и поместил его туда. Однако моя идея не удалась.
Способ загрузки файлов очень просто нажать на ссылку. Фон выводит поток файла и реализует функцию загрузки через браузер, включая запросы о местоположении и хранилище файлов. Большинство браузеров будут настраивать фиксированное местоположение и могут не спрашивать каждый раз.
Фронт-энд очень прост, тег <a>, href = "Адрес ответного метода". Если ваши потребности не могут быть непосредственно использованы в гиперссылке, вы можете написать это в JS
window.location.href = "Адрес ответного метода".
После перехода на метод справочной
String filePath = this.getClass (). GetClassLoader (). GetResource (""). Touri (). GetPath () + "/exportpdf.pdf"; // Путь файла в файле проекта outfile = new File (filePath); String fileName = outFile.getName (); // Получить имя файла inputStream fis = new BufferedInputStream (new FileInputStream (filePath)); byte [] buffer = new Byte [fis.aveable ()]; fis.read (buffer); // Чтение потока файла fis.close (); response.reset (); // сбросить ответ набора результатов. ADDHeader ("Content-Disposition", "Attachment; filename =" + new String (filename.replaceall ("", "") .getbytes ("utf-8"), "iso8859-1")); // возвращать имя файла заголовка. // вернуть размер файла заголовка. // Установите тип данных // Получить выходной корпус возвращаемого корпуса вправо outputStream OS = new BufferedOutputStream (response.getOutputStream ()); Os.Write (буфер); // выходной файл os.flush (); os.close (); Браузер напрямую распознает эту форму вывода файла, и появляется диалоговое окно.
Обратите внимание, что этот метод должен быть скорректирован в фоновом режиме с использованием метода ссылки. Невозможно использовать методы Ajax и Xmlhttprequest. Таким образом, возвращаемый поток файлов будет возвращен в функцию обратного вызова метода. Конечно, если вы хотите получить файл в JS, это будет работать.
Пример
Пакет cn.itcast.day06.web.servlet; Импорт java.io.ioexception; импорт java.io.inputstream; импорт java.io.outputstream; импорт java.net.urlencoder; Импорт javax.servlet.servletcontext; import javax.servlet.servletexception; import javax.servlet.http.httpservlet; импорт javax.servlet.http.httpservletrequest; импорт javax.servlet.htp.httpservelcesponse; Public Class DownloadServlet расширяет httpservlet {public void doget (httpservletrequest, httpservletresponse response) throws servletexception, ioexception {// Реализация функции против кражки // Получить заголовок рефериста, чтобы объяснить, откуда посетитель поступает строки request.getheader («Рефератор»); if (referer == null ||! referer.startswith ("http: // localhost")) {// Это ссылка на вор response.sendredirect ("/day06/index.jsp"); возвращаться ; } // Решить проблему ответа китайского искаженного ответа. // Установить кодирование тела сообщения // Заголовок ответа HTTP, отправленный через протокол HTTP, не может появиться на китайском китайском языке, китайцы должны быть URL-кодированием строкового файла = urlencoder.encode ("beauty.jpg", "UTF-8"); // Уведомить браузер для чтения ресурса. // Читать данные изображения и отправить его в строку браузера IE webpath = "/download/beauty.jpg"; // эквивалент пути текущего веб -приложения ServletContext ServletContext = super.getServletContext (); InputStream in = ServletContext.getResourCeasStream (WebPath); OutputStream out = response.getOutputStream (); int len; Byte [] buffer = новый байт [1024]; while ((len = in.read (buffer))! =-1) out.write (buffer, 0, len); } public void Dopost (httpservletRequest, httpservletresponse response) Throws ServletException, ioException {Doget (запрос, ответ); }}