При разработке системы веб -приложений функции загрузки файлов и загрузки являются очень часто используемыми функциями. Сегодня давайте поговорим о реализации функций загрузки и загрузки файлов в Javaweb.
Обзор загрузки файлов
1. Функция загрузки файла
Например, сетевой жесткий диск! Он используется для загрузки и загрузки файлов.
Чтобы заполнить полное резюме на Zhilian Recruitment, вам также необходимо загрузить фотографии.
2. Требования к загрузке страницы
Есть много требований для загрузки файлов, пожалуйста, помните:
Форма должна быть использована, а не метод формы гиперссылки должен быть почтой, а не
Enctype формы должен быть многопорт/форм-даты
Добавить поле формы файла в форму, то есть <input type = "file" name = "xxx"/>
<form action="${pageContext.request.contextPath }/FileUploadServlet" method="post" enctype="multipart/form-data"> Username: <input type="text" name="username"/><br/> File 1: <input type="file" name="file1"/><br/> File 2: <input type="file" name = "file2"/> <br/> <input type = "Отправить" value = "Opper"/> </form>3. Сравните разницу между формой загрузки файла и обычной текстовой формой
Просмотрите разницу между «формой загрузки файла» и «обычной текстовой формой» через httpwatch.
Enctype of file upload form = "Multipart/Form-Data", который представляет данные с несколькими частями;
Нормальные текстовые формы могут быть установлены без настройки атрибута enctype:
Когда Method = ”post”, значение по умолчанию Enctype-это приложение/x-www-form-urlencodived, что означает, что когда используется метод = ”get”, значение по умолчанию enctype является нулевым, и текст нет, поэтому нет необходимости проверять обычную форму текста:
<form action = "$ {pagecontext.request.contextpath}/fileuploadservlet" method = "post"> username: <input type = "text" name = "username"/> <br/> файл 1: <input type = "file" file1 "/> <br/> file 2: <input =" file "name =" file2 "/> <br/> <br/>" inpute = "name =" file2 "/> <br/> <br/> <bry". value = "propect"/> </form>Благодаря тестированию httpwatch, рассмотрению корпуса данных запроса формы, мы обнаружили, что в запросе есть только имя файла, но нет содержимого файла. То есть, когда Enctype формы не является многопорт/форм-данных, запрос не содержит содержимое файла, а только имя файла, что означает, что нет никакой разницы между входом: файл и вход: текст в нормальной текстовой форме.
Форма загрузки файла тестирования:
<form action="${pageContext.request.contextPath }/FileUploadServlet" method="post" enctype="multipart/form-data"> Username: <input type="text" name="username"/><br/> File 1: <input type="file" name="file1"/><br/> File 2: <input type="file" name = "file2"/> <br/> <input type = "Отправить" value = "Opper"/> </form>Благодаря тесту HTTPWATCH мы рассматриваем часть данных запроса формы и обнаружили, что часть корпуса состоит из нескольких компонентов, каждый компонент соответствует поле форм, и каждый компонент имеет свою собственную информацию заголовка. Под заголовком информация находится пустая линия, а под пустой линией находится часть корпуса поля. Несколько частей разделены случайно сгенерированными разделителями.
Информация о заголовке текстового поля содержит только одну информацию о заголовке, а именно динамичность контента. Значение этой информации заголовка имеет две части. Первая часть фиксированная, а именно: DATA, а вторая часть-это название поля. За пустой линией находится основная часть, а основная часть - контент, заполненный в текстовом поле.
Информация заголовка поля файла содержит два заголовка, динамичность контента и тип контента. Существует дополнительное имя файла в дистанции контента, которое указывает загруженное имя файла. Контент-тип указывает тип загруженного файла. Основной частью поля файла является содержимое файла.
Обратите внимание, что, поскольку файлы, которые мы загружаем, являются нормальными текстовыми файлами, то есть файлами TXT, их можно отображать в HTTPWatch. Если загруженные файлы - EXE, MP3 и т. Д., То, что вы видите на HTTPWatch, искажено.
4. Требования к сервлетам при загрузке файлов
Когда представленная форма является формой загрузки файла, существуют также требования для сервлета.
Прежде всего, мы должны быть уверены, что данные формы загрузки файла также инкапсулируются в объект запроса.
Метод запроса.getParameter (String) получает указанное содержимое символов поля формы, но форма загрузки файла больше не является содержимым символов, а содержимого байта, поэтому он недействителен.
В настоящее время вы можете использовать метод GetInputStream () для получения объекта ServletInputStream. Это подкласс InputStream. Этот объект ServletInputStream соответствует части корпуса всей формы (начиная с первого разделителя до конца), которая показывает данные в необходимых в нашем потоке анализов. Конечно, анализ, это очень хлопотно, и Apache предоставила нам инструменты для анализа: Commons-FileUpload
Вы можете попытаться распечатать содержимое потока request.getInputStream () и сравнить данные запроса в httpwatch.
public void Dopost (httpservlectrequest, httpservletresponse response) бросает Servletexception, ioException {inputStream in = request.getInputStream (); String s = ioutils.tostring (in); System.out.println (s);}----------------------------- 7ddd3370ab2content-Disposition: Form-Data; name = "username" Привет ----------------------------- 7DDD3370AB2Content-Disposition: Form-Data; name = "file1"; filename = "a.txt" content-type: text/plainaaa ----------------------------- 7ddd3370ab2content-Disposition: Form-Data; name = "file2"; filename = "b.txt" тип контента: текст/plainbbb ----------------------------- 7ddd3370ab2--
Commons-FileUpload
Зачем использовать FileUpload:
Есть много требований для загрузки файлов, пожалуйста, помните:
Должен быть формой поста;
Enctype формы должен быть многопорт/форм-даты;
Добавить поле файла в форму, т.е.
Требования сервлета:
Вы больше не можете использовать request.getParameter () для получения данных формы. Вы можете использовать request.getInputStream (), чтобы получить все данные формы, а не данные элемента формы. Это означает, что вы не используете FileUpload, нам нужно анализировать содержимое request.getInputStream () сами.
1. Обзор FileUpload
FileUpload - это компонент загрузки, предоставляемый компонентом Apache Commons. Его основная задача - помочь нам parse request.getinputstream ()
Пакеты JAR, требуемые компонентом FileUpload:
Commons-fileUpload.jar, основной пакет
Commons-IO.Jar, пакет зависимости
2. Простое применение файловой загрузки
Основные классы FileUpload: DiskFileItemFactory, ServletFileUpload, FileItem
Шаги по использованию компонента FileUpload следующие:
// 1. Создать заводской класс DiskFileItemFactory Object DiskFileItemfactory Factory = new DiskFileItemFactory (); // 2. Создайте объект анализатора, используя заводскую ServletFileUpload FileUpload = New ServletFileUpload (Factory); // 3. Используйте анализатор для анализа списка объектов запроса <FieleItem> list = fileupload.parserequest (request);
DiskFileItemfactory Disk File Item Class Class
Public DiskFileItemFactory (int sizethreshold, файл репозиторий)
При построении фабрики укажите размер буфера памяти и местоположение временного хранилища файлов.
public void setsizethershold (int sizethreshold)
Установите размер буфера памяти, по умолчанию 10K
public void setRepository (файл репозиторий)
Установите местоположение временного хранилища файлов, System.getProperty ("java.io.tmpdir").
Буфер памяти: при загрузке файла содержимое загруженного файла сначала сохраняется в буфере памяти. Когда загруженный размер файла превышает размер буфера, временные файлы будут сгенерированы на стороне сервера.
Временное местоположение хранилища файлов: загрузить файлы, превышающие размер буфера памяти для генерации временных файлов. Временные файлы могут быть удалены с помощью метода FileItem delete ()
FileItem представляет каждую часть данных в форме загрузки файла
Мы представим класс FileItem, который является конечным результатом, который мы хотим. Объект FileItem соответствует элементу формы (поле формы). Файл -поля и нормальные поля существуют в форме. Вы можете использовать метод isformfield () класса FileItem, чтобы определить, является ли поле формы нормальным полем. Если это не нормальное поле, то это поле файла.
ПРИМЕЧАНИЕ. Поскольку форма загрузки файла кодируется с использованием Multipart/Form-Data, отличается от традиционного кодирования URL, все методы getParameter () не могут использовать setCaracterencoDing () не может решить искаженную проблему входных элементов.
ServletFileUpload File Загрузка класса Core Class
3. Пример простого загрузки
Напишите простой пример загрузки:
Форма содержит поле имени пользователя и поле файла;
Сервлет сохраняет загруженные файлы в каталог загрузки, отображая имя пользователя, имя файла, размер файла, тип файла.
Первый шаг:
Для завершения index.jsp необходима только одна форма. Обратите внимание, что форма должна быть публикация, а enctype должен быть mulitpart/form-data
<form action="${pageContext.request.contextPath }/FileUploadServlet" method="post" enctype="multipart/form-data"> Username: <input type="text" name="username"/><br/> File 1: <input type="file" name="file1"/><br/> <input type="submit" value="submit"/></form>Шаг 2: Полный файл.
public void Dopost (httpservletRequest, httpservletresponse response) бросает ServletException, ioException {// Потому что вы хотите печатать с ответом, установите его кодирование. // Создать Factory DiskFileItemFactory DFIF = new DiskFileItemFactory (); // Создать объект анализатора с использованием заводского сервисного файла fileupload = new ServletFileUpload (DFIF); try {// Использовать объект Parser для анализа запроса и получить список списков FileItem <FieleItem> list = fileUpload.parseRequest (request); // Переносить все элементы формы для (fileitem fileitem: list) {// Если элемент текущей формы является обычным элементом формы if (fileitem.isformfield ()) {// Получить имя поля текущего элемента формы stringname = fileitem.getfieldname (); // Если имя поля текущего элемента формы является именем пользователя if (fieldname.equals ("username")) {// print Содержимое текущего элемента формы, то есть содержимое, введенное в соответствии с элементом имени пользователя. }} else {// Если элемент текущей формы не является обычным элементом формы, это означает, что строка поля файла name = fileitem.getName (); // Получить имя загруженного файла // Если загруженное имя файла пусто, не загружается файл, если (name = null || name.isempty ()) {contining; } // Получить реальный путь, соответствующий $ {каталог проекта}/загрузки. Конечно, этот каталог должен иметь string savePath = this.getServletContext (). GetRealPath ("/uploads"); // Создание объекта файла через каталог загрузки и файл имени файла файл = новый файл (savePath, name); // Сохранить файл загрузки в указанное местоположение fileitem.write (file); // Распечатать имя response file upload.getWriter (). Print ("upload file name:" + name + "<br/>"); // Распечатать размер ответа на файл upload.getWriter (). Print ("Размер файла загрузки:" + fileitem.getSize () + "<br/>"); // Распечатать тип загруженного файла response.getWriter (). Print ("upload file type:" + fileitem.getContentType () + "<br/>"); }}} catch (Exception e) {Throw New ServletException (e); }}Загрузка файла
1. Поместите загруженный файл в каталог Web-Inf
Если файлы, загруженные пользователем, не хранятся в каталоге Web-Inf, пользователь может напрямую получить доступ к загруженным файлам через браузер, что очень опасно.
Если пользователь загружает файл A.JSP, а затем пользователь обращается к файлу A.JSP через браузер, то будет выполнен контент в A.JSP. Если в A.JSP есть следующее утверждение: runtime.getRuntime (). Exec ("Shutdown St 1"); Тогда ты будешь ...
Обычно мы создадим каталог загрузки в каталоге Web-Inf для хранения загруженных файлов. Чтобы найти этот каталог в сервлете, нам нужно использовать метод GetRealPath (String) ServletContext. Например, в моем проекте upload1 есть следующее утверждение:
ServletContext servletContext = this.getServletContext (); String savePath = servletContext.getRealPath ("/web-inf/uploads");SavePath: f:/tomcat6_1/webapps/upload1/web-inf/uploads.
2. Имя файла (полный путь, имя файла)
Загруженное имя файла может быть полным путем:
Имя файла загрузки, полученное IE6, является полным путем, в то время как имя файла загрузки, полученное другими браузерами, является просто именем файла. Нам все еще нужно справиться с проблемой различий в браузерах
String name = file1fileTem.getName (); ounces.getWriter (). Print (name);
Используя различные браузеры для тестирования, IE6 вернет полный путь для загрузки файла. Я не знаю, что делает IE6, что доставляет нам много проблем, которые должны решить эту проблему.
Также очень просто решить эту проблему. Будь то полный путь или нет, мы просто перехватываем контент после последнего "/"
String name = file1fileItem.getName (); int astinDex = name.lastIndexof ("//"); // Получить позицию последнего "/" if (astinDex! = -1) {// Обратите внимание, что если это не полный путь, то не будет "/"/". name = name.substring (antindex + 1); // Получить имя файла} response.getWriter (). print (name);3. Китайская искаженная проблема
Загруженное имя файла содержит китайский:
Когда загруженное имя содержит китайский, вам нужно установить кодирование. Компонент Commons-FileUpload предоставляет нам два способа установить кодирование:
request.setcharacterencoding (String): этот метод - самый знакомый способ, которым мы есть.
fileupload.setheaderencdoing (String): этот метод имеет более высокий приоритет, чем предыдущий
Содержание файла загруженного файла содержит китайский:
Обычно нам не нужно заботиться о содержании загрузки файлов, потому что мы сохраняем загруженные файлы на жесткий диск! Другими словами, как выглядит файл и как он выглядит на сервере!
Но если у вас есть такое требование и вы должны отобразить загруженное содержимое файла на консоли, то вы можете использовать fileitem.getString ("UTF-8") для обработки кодировки
Содержание текстового файла и обычное содержание элемента формы Использование GetString ("UTF-8") класса FileItem для обработки кодирования.
4. Проблема загрузки файла с тем же именем (переименование файла)
Обычно мы сохраняем файл, загруженный пользователем, в каталог загрузки, но что, если пользователь загружает файл с тем же именем? Это вызовет покрытие. Метод для решения этой проблемы состоит в том, чтобы использовать UUID для генерации уникального имени, а затем использовать «_» для подключения исходного имени, загруженного файлом.
Например, файл, загруженный пользователем, - это «мое одно дюймовое фото.jpg». После обработки имя файла: «891B3881395F4175B969256A3F7B6E10_MY ONE JUNT Photo.jpg». Этот метод не приведет к тому, что файл потеряет свое расширение. Из -за уникальности UUID загруженный файл имеет одинаковое имя, но с тем же именем не будет никаких проблем с тем же именем.
public void Dopost (httpservletRequest, httpservletresponse response) бросает ServletException, ioException {request.setcharacterencoding ("UTF-8"); Diskfileitemfactory dfif = new DiskFileItemFactory (); ServletFileUpload fileUpload = new ServletFileUpload (DFIF); try {list <fieleTem> list = fileupload.parserequest (request); // Получение элемента второй формы, поскольку первая элемент формы является именем пользователя, вторым является элемент формы файла fileitem fileitem = list.get (1); String name = fileitem.getName (); // Получить имя файла // Если клиент использует IE6, то вам нужно получить имя файла из полного пути int intIndex = name.lastIndexof ("//"); if (lastindex! = -1) {name = name.substring (astinDex + 1); } // Получить загруженный файл savePath = this.getServletContext (). GetRealPath ("/web-inf/uploads"); String uuid = commonutils.uuid (); // генерировать uuid string filename = uuid + "_" + name; // новое имя файла uuid + underscore + night name // Создать объект файла, а загруженный файл будет сохранен в файл файл (FilePate, файл, файл, файл, файл, файл, файл, файл, файл, файл, файл, файл. имя файла); // Сохранить файл item.write (file); } catch (Exception e) {бросить новое ServletException (e); }}5. Справочник не может хранить слишком много файлов (каталог хранить для расставания)
Не должно быть слишком много файлов, хранящихся в каталоге. Как правило, 1000 файлов хранятся в каталоге, и если их будет много, это будет очень «взломано» при открытии каталога. Вы можете попробовать напечатать каталог C:/Windows/System32, вы почувствуете это
То есть нам нужно поместить загруженные файлы в разные каталоги. Тем не менее, один каталог не может быть использован для каждого загруженного файла, так как этот метод приведет к слишком большому количеству каталогов. Поэтому мы должны использовать какой -то алгоритм, чтобы «расстаться»!
Есть много способов разбить его, такие как использование дат, чтобы разбить его, каждый день генерируют каталог. Вы также можете использовать первую букву имени файла для генерации каталога, а файлы с той же начальной буквой размещаются в том же каталоге.
Алгоритм даты даты: если в определенный день загружено слишком много файлов, также будет слишком много файлов каталогов;
Алгоритм разрыва первой буквы: если имя файла на китайском языке, потому что их слишком много китайцев, это приведет к слишком большому количеству каталогов.
Мы используем здесь алгоритм хэш, чтобы разбить его:
Получить хэшкод имени файла: int hcode = name.hashcode ()
Получите нижние 4 бита Hcode, затем преобразуйте его в шестнадцатеричные символы, чтобы получить 5 ~ 8 бит Hcode, а затем преобразовать его в шестнадцатеричные символы, чтобы сгенерировать цепочку каталогов, используя эти два шестнадцатеричных символа. Например, нижние 4-битные символы "5"
Преимущество этого алгоритма состоит в том, что в каталоге загрузки генерируется максимум 16 каталогов, а в каждом каталоге генерируется максимум 16 каталогов, то есть 256 каталогов, и все загруженные файлы помещаются в эти 256 каталогов. Если максимальное количество каждого каталога составляет 1000 файлов, можно сохранить в общей сложности 256 000 файлов.
Например, имя файла upload: новый текстовый документ. Если нижние 4 бита: 9 и 5 ~ 8 битов - 1, то путь сохранения файла загружен/9/1/
int hcode = name.hashcode (); // Получить хэшкод имени файла // Получить низкие 4 бита Hcode и преобразовать его в шестнадцатеричную строку строки dir1 = integer.tohexstring (hcode & 0xf); // Получить низкий 5 ~ 8 битов hcode и конвертировать его в строку hexadecimal string 2 = hcode. >>> 4 & 0xf); // Подключить путь сохранения файла к полному пути savePath = savePath + "/" + dir1 + "/" + dir2; // Поскольку этот путь не может существовать, создайте его как объект файла, а затем создайте цепочку каталогов, чтобы убедиться, что каталог уже существует новый.
6. Пределы размера для отдельных загруженных файлов
Очень просто ограничить размер загруженных файлов, просто SetFilesizeMax (Long) класса ServletFileUpload. Параметр является верхним пределом номера байтов загруженного файла. Например, ServletFileUpload.SetFileSizeMax (1024*10) означает, что верхний предел составляет 10 КБ.
После того, как загруженный файл превышает верхний предел, будет брошено исключение FileUploadBase.filesizeLimitexedException. Мы можем получить это исключение в сервлете, а вывод «загруженный файл превышает ограничение» на страницу.
public void Dopost (httpservletRequest, httpservletresponse response) бросает ServletException, ioException {request.setcharacterencoding ("UTF-8"); Diskfileitemfactory dfif = new DiskFileItemFactory (); ServletFileUpload fileUpload = new ServletFileUpload (DFIF); // Установить верхний предел загруженного отдельного файла на 10 КБ fileupload.setFilesizeMax (1024 * 10); try {list <fieleTem> list = fileupload.parserequest (request); // Получить элемент второй формы, поскольку элемент первой формы является именем пользователя, вторым является элемент формы файла fileitem = list.get (1); String name = fileitem.getName (); // Получить имя файла // Если клиент использует IE6, то вам нужно получить имя файла из полного пути int intIndex = name.lastIndexof ("//"); if (lastindex! = -1) {name = name.substring (astinDex + 1); } // Получить загруженный файл savePath = this.getServletContext (). GetRealPath ("/web-inf/uploads"); String uuid = commonutils.uuid (); // генерировать uuid string filename = uuid + "_" + name; // новое имя файла uuid + underscore + night name int hcode = name.hashcode (); // Получить hashcode от имени файла // Получить нижние биты hcode and convert It it it hexadecode name file // Получить нижние биты hcode and convert It it it hexadecode name // keep 4 bits hcode and convert It it it hexAdeCamal string -string111 = // Integer.tohexstring (hcode & 0xf); // Получить нижние 5 ~ 8 бит Hcode и преобразовать его в шестнадцатеричную строку строки dir2 = integer.tohexstring (hcode >>> 4 & 0xf); // Подключите путь сохранения файла с полным пути savePath = savePath + "/" + dir1 + "/" + dir2; // Поскольку этот путь не может существовать, создать объект файла, а затем создать цепочку каталогов, чтобы убедиться, что каталог уже существует перед сохранением нового файла файла (SavePath) .mkdirs (); // Создание файлового объекта, и загруженный файл будет сохранен в пути, указанном этим файлом // savePath, то есть загруженный каталог сохранения файла // имя файла, файл, файл; // Сохранить fileitem.write (file); } catch (Exception e) {// определить, является ли тип исключения брошенного файла fileuploadbase.filesizeLimitexedEdexception // Если да, то это означает, что предел превышался при загрузке файла. if (e encosf fileuploadbase.filesizeLimitexedEdException) {// Сохранить сообщение об ошибке в запросе request.setAttribute («msg», «upload fake! Загруженный файл превышал 10 кб!»); // Перейдите на страницу index.jsp! На странице index.jsp вам необходимо использовать $ {msg} для отображения запроса сообщения об ошибке. GetRequestDispatcher ("/index.jsp"). Forward (запрос, ответ); возвращаться; } бросить новый ServletException (e); }}7. Общий ограничение размера для загрузки файлов
Форма для загрузки файла может позволить загружать несколько файлов: например:
Иногда нам нужно ограничить размер запроса. То есть максимальное количество байтов для этого запроса (сумма всех элементов формы)! Реализация этой функции также очень проста. Вам нужно только вызвать метод SetSizeMax (Long) класса ServletFileUpload.
Например, fileupload.setsizemax (1024 * 10);, верхний предел для всего запроса составляет 10 КБ. Когда размер запроса превышает 10 КБ, метод parserequest () класса ServletFileUpload будет выбросить исключение FileUploadBase.sizelimitexededException.
8. Размер кэша и временный каталог
Подумайте об этом, если я загружаю фильм Blu-ray, сначала сохраните фильм в память, а затем скопирую его на жесткий диск сервера через память, а затем можно съесть вашу память?
Следовательно, компонент FileUpload не может сохранить все файлы в памяти. FileUpload определит, превышает ли размер файла 10 КБ. Если так, сохраните файл на жесткий диск. Если это не превышает его, сохраните его в памяти.
10 КБ - это значение по умолчанию FileUpload, мы можем установить ее.
Когда файл сохраняется на жестком диске, FileUpload сохраняет файл в системный временный каталог. Конечно, вы также можете установить временный каталог
public void Dopost (httpservletRequest, httpservletresponse response) бросает ServletException, ioException {request.setcharacterencoding ("UTF-8"); Diskfileitemfactory dfif = new DiskFileItemFactory (1024*20, новый файл ("f: // temp")); ServletFileUpload fileUpload = new ServletFileUpload (DFIF); try {list <fieleTem> list = fileupload.parserequest (request); Fileitem fileitem = list.get (1); String name = fileitem.getName (); String savePath = this.getServletContext (). GetRealPath ("/web-inf/uploads"); // Сохранить fileitem.write (path (path (savepath, name));} catch (excection e) {throw new servletexception (e);}} private file path (String savePath, String filename) {// Получить имя файла int с полного пути antindex = filename.lastIndex ("//); filename.substring (Lastindex + 1); DIR2;Файл Скачать
1. Скачать 1 через Сервлет
Загруженные ресурсы должны быть размещены в каталоге Web-Inf (все в порядке, если пользователь не может получить доступ непосредственно через браузер), а затем загружать его через сервлет.
Дайте гиперссылку на странице JSP, ссылку на DownloadServlet и предоставьте имя файла для загрузки. Затем DownloadServlet получает реальный путь файла и записывает файл в потоку response.getOutputStream ().
Скачать.jsp
<body> Это моя страница JSP. <br> <a href = "<c: url value = '/downloadservlet? path = a.avi' //>"> a.avi </a> <br/> <a href = "<c: url value = '/downloadservlet? value = '/DownloadServlet? PATH = A.Txt' ////> "> A.Txt </a> <br/> </body>
Downloadservlet.java
public void Doget (httpservletrequest, httpservletresponse response) Throws ServletException, ioException {String fileName = request.getParameter ("path"); String filePath = this.getServletContext (). GetRealPath ("/web-inf/uploads/" + filename); File file = new File (filePath); if (! file.exists ()) {response.getWriter (). Print («Файл, который вы хотите загрузить, не существует!»); возвращаться; } Ioutils.copy (new FileInputStream (file), response.getOutputStream ());}Приведенный выше код имеет следующие проблемы:
1. Вы можете скачать A.Avi, но имя файла в поле загрузки - загрузка -сервис;
2. Вы не можете скачать A.Jpg и A.Txt, но отобразить их на странице.
2. Скачать 2 через Сервлет
Давайте разберемся с проблемой в предыдущем примере, чтобы загрузка могло отображать правильное имя файла, и вы можете загрузить файлы A.JPG и A.TXT
Обработайте вышеупомянутую проблему, добавив заголовок дискозирования контента. При установке заголовка контента-динамита, браузер всплывает коробку для загрузки
И вы также можете указать название загруженного файла через заголовок Disposition!
String fileName = request.getParameter ("path"); String filePath = this.getServletContext (). GetRealPath ("/web-inf/uploads/" + filename); File file = new File (filePath); if (! file.exists ()) {response.getWriter (). Print («Файл, который вы хотите загрузить, не существует!»); возвращаться; } response.Addheader ("Контент-дискуссия", "Attactment; filename =" + filename); Ioutils.copy (new FileInputStream (file), response.getOutputStream ());Хотя приведенный выше код уже может обрабатывать загрузку файлов, таких как TXT и JPG, а также обрабатывать проблему отображения имен файлов в поле загрузки, если загруженное имя файла на китайском языке, то он все еще не может
3. Скачать 3 через сервис
Ниже возникает проблема обработки китайца в коробке для загрузки!
На самом деле, этот вопрос очень прост. Вам нужно только кодировать китайский через URL!
Скачать.jsp
<a href = "<c: url value = '/downloadservlet? Path = этот убийца не слишком холодный. Avi' //>"> Этот убийца не слишком холод. href = "<C: url value = '/downloadservlet? path = description.txt'/>"> description.txt </a> <br/>
Downloadservlet.java
String fileName = request.getParameter ("path"); // В запросе GET китайский параметр содержит китайцы и должен быть преобразован самостоятельно. // Конечно, если вы используете «фильтр глобального кодирования», то вам не нужно иметь дело с ним здесь здесь. File (filePath); if (! File.exists ()) {response.getWriter (). Print («Файл, который вы хотите загрузить, не существует!»); return;} // Все браузеры будут использовать локальную кодировку, то есть китайская операционная система использует GBK // После получения этого имени файла, она будет использовать ISO-8859-1 для декодирования файла = новая строка (FileName.getBytes («GBK»), «isO-8859-1»); имя файла); ioutils.copy (new FileInputStream (file), response.getOutputStream ());Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.