При разработке системы веб -приложений очень часто используются функция загрузки и загрузки файла.
Для загрузки файлов браузер передает файл на сторону сервера во время загрузки браузера. Необогированные, так что, как правило, вы решите использовать Apache's Apache's Apache. Этот пакет компонента загрузки с обычной загрузкой может быть загружен на официальном веб-сайте Apache, или вы можете найти его под папкой LIB Struts. Common-FileUpload зависит от пакета Common-IO, поэтому вам нужно загрузить этот пакет.
1. Строительство развития
Создайте проект FileUploadandDownload, добавьте файл Apache Commons-FileUpload, чтобы загрузить соответствующий пакет JAR компонента, как показано на рисунке ниже:
2. Реализация загрузки файла
2.1, страница загрузки файла и страница запроса сообщений
Код страницы upload.jsp выглядит следующим образом:
<%@ page language = "java" pageencoding = "utf-8"%> <! }/Servlet/uploadhandleservlet "ectype =" multipart/form-data "method =" post "> upload user: <input type =" text "name =" username "> <br/> файл загрузки 1: <input type =" Файл "name =" file1 "> <br/> файл загрузки 2: <input type =" file "name =" file2 "> <br/> <input type =" Отправить "value =" value = "Отправить" </ Форма> </body> </html>
Код сообщения.
<%@ page language = "java" pageencoding = "utf-8"%> <!
2.2, обработайте службу, загруженную файлом
Код uploadhandleservlet заключается в следующем:
Пакет Me.gacl.web.controller; ; Пусть {Public Oid Doget (httpservlectrequest, httpservletresponse response) бросает ServletException, ioException {// владеть каталогом сохранения загруженного файла и сохраняет загруженные файлы в каталоге Web-Inf, ему не разрешено получить доступ непосредственно, чтобы обеспечить, чтобы убедиться, что загруженные файлы. Safe String SavePath = this.getServletContext (). ) &&! "" "; try {// Использовать файл Apache для загрузки компонентов обработки файла. Фабрика); 4. Используйте анализатор ServiceFileUpload для анализа и загрузки. item if (item.isformfield ()) {string name = item. // value = new String (value.getBytes ("iso8859-1"), "utf -8"); инкапсулирован в FileItem, имя загруженного файла, String FileName = item.getName (); Продолжить;} // Примечание. Имена файлов, представленные разными браузерами, разные, некоторые браузеры отправляют имена файлов с путями, такие как: c: /a/b/1.txt, а некоторые - просто имена файлов, такие как : 1.txt // Обработка в пути имени, только имя файла файла fileName = filename.substring (fileName.lastIndexof ("//"); // Получить поток ввода в файле загрузки во intount -in in in = = item.getInputStream ();//Создание потока вывода файла FileOutputStream OUT = new FileOutputStream (savePath + "//" + filename); Прочитали ли данные в входном потоке готовый логотип int len = 0; в)> 0) {// Напишите данные буфера в указанный каталог (SAVEPATH + "//" + FILENAME) с помощью выходного потока FileOutputStream. close (); ";}}} Catch (Exception e) {message =" Загрузка файла не удалась! "; E.printstacktrace ();} request.setattribute (" message ", message); request.getRequestDispatcher (" /message.jsp ") (Запрос, ответ);}}
Зарегистрировать uploadhandleservlet в файле web.xml
<Servlet> <servlet-name> uploadhandleServlet </servlet-name> <verlet-class> me.gacl.web.controller.uploadleservlet </servlet-class> </servlet> <sers> let-mapping> <servlet-name > uploadhandleservlet </servlet-name> <url-pattern>/servlet/uploadhandleservlet </url-pattern> </servlet-mapping>
Эффект бега выглядит следующим образом:
После того, как файл успешно загружен, загруженный файл хранится в каталоге загрузки в каталоге Web-Inf, как показано на рисунке ниже:
2.3.
Хотя приведенный выше код может быть успешно загружен в указанный каталог на сервере, существует много мелких деталей, которые требуют внимания к функции загрузки файла.
1. Чтобы обеспечить безопасность сервера, файл загрузки должен быть помещен в каталог, к которому внешний мир не может получить непосредственный доступ, например, в каталоге Web-Inf.
2. Чтобы предотвратить покрытие файла, необходимо сгенерировать уникальное имя файла для загрузки файлов.
3. Чтобы предотвратить слишком много файлов в каталоге, используйте алгоритм хэш для рассеяния хранилища.
4. Ограничьте максимальное значение файлов загрузки.
5. Необходимо ограничить тип файлов загрузки.
В ответ на 5 деталей вышеизложенного, давайте улучшить загрузку.
Пакет Me.gacl.web.controller; Импорт Javax.serslet.servletexception; .Apache.commons.fileUpload.progresslieser; @Author: доступность Wolf * @date: 2015-1-3 вечера 11:35:50 * */ public class upload ex. Справочник загрузки хранится в каталоге Web-Inf. upload сохраняет строку каталога testh = this.getServletContext (). Сообщение string message = "" "" "" "; Буфер завода. Factory.setsizethershold (1024*100); // 2. Создать файл для загрузки Service Service -FileUpload upload = new ServiceFileUpload (Factory); {Система.处理 7367 Размер файла: 14608, текущая обработка: 11419 Размер файла: 14608, в настоящее время обрабатывается: 14608 */}}); -8 "); // 3. Определите, являются ли предоставленные данные Data if (! ServletfileUpload.ismultipartCont (request)) {// Получить возврат данных традиционным способом; 1024*1024 байт, то есть 1 МБ upload.setFileSizeMax (1024*1024); 、使用 ServletFileUpload 解析器解析上传数据 , 解析结果返回的是一个 List <fieleTem> 集合 , 每一个 FileItem 对应一个 Форма 表单的输入项 List <FieleItem> list = upload.parserequest (запрос); {// Если он инкапсулируется в FileItem, данные обычных входных элементов (itemformfield ()) {string name = item.getfieldname (). string value = item.getString ("UTF-8"); + value);} else {// Если имя файла загружается загруженным файлом в FileItem, String FileName = item.getName (); ") {Продолжение;} // Примечание: имена файлов, представленные разными браузерами, разные, некоторые файлы, представленные браузерами Простые имена файлов, такие как: 1.txt // Обработка имени файла имени файла полученного файла, полученного, только сохраняют только файл = filename.substring (filename.lastindexof ("//"); // Получить расширение из загруженного файла string fileextname = filename.substring (fileName.lastIndexof ("..") +1); System.out.println ("Расширение загруженного файла:"+fileextname); Файл string SaveFilename = MakeFilename (FileName); Новый байт [1024]; Указывает, что существуют данные, когда ((len = in.read (buffer)) >> 0) {// Записать данные буфера в указанный каталог (SavePath + "//" + filename) с помощью выходного потока FileOutputStream . ";}}} Catch (fileuploadbase.filesizeLimiteXcexception e) {e.printStackTrace (); request.setAttribut ") .Forward (запрос, ответ); return;} catch (fileuploadbase.sizelimitexceexception e) {e.printstacktrace (); Age", «Общий размер файла загрузки находится за пределами максимального предела!»; "/Message.jsp"). "; E.printstacktrace ();} request.setattribute (" message ", message); request.getRequestDispatcher (" /message.jsp ") Имя файла загрузки, имя файла: uuid+"_"+исходное имя файла* @anthor: исходное имя одинокого гордая волчья* @param файл файла файла* @return uuid+"_"+исходное имя файла * /Private String MakeFilEname (String FileName) {//2.jpg // Чтобы предотвратить покрытие файла, необходимо сгенерировать уникальное имя файла uuid.randomuuid (). * Чтобы предотвратить слишком много файлов в каталоге, используйте алгоритм хэш для диспергирования хранилища * @method: MakePath * @description: * @anthor: доступное имя файла Wolf * @param, согласно имени файла. * @Param SavePath PATH PATH* @return Новый каталог хранилища*/private String MakePath (String FileName, String SavePath) {// Значение хешкода имени файла -объект FILENAM E -STRING В этом адресу памяти int hashcode = filename.hashcode (); "//" + DIR2; File.exist ()) {// Создать файл каталога.mkdirs ();} return dir;} public void dopost (httpservletrequest, httpservletresponse) Servletexception, ioexception {Doget (запрос, ответ);
После улучшения приведенных выше 5 мелких деталей, наша функция загрузки файлов более полна.
Три, загрузка файла
3.1.
Нам необходимо предоставить пользователю ресурсы файлов для загрузки. Операция загрузки выполняется.
Код Listfileservlet заключается в следующем:
Пакет Me.gacl.web.controller; ; -4 9:54:40 **/ public class listfileservlet extends httpservlet {public void doget (httpservletrequest, httpservletresponse) ows servletexception, ioexception {// Получить каталог загрузки файла stringfilepath = this.getservletcontext () .getRealpath (" /Web-inf/upload "); // сохранить карту имен файла <string, string> filenamemap = new hashmap <string, string> (); файлы и каталог сохраните имя файла в файл в списке (новый файл (New FilePilePath), filenamemap); /Listfile.jsp "). Forward (запрос, ответ);}/*** @method: listfile* @descripting: рекурсивный обход в указанном каталоге All Files* @anthor: доступный файл Wolf* @param означает файл, файл, файл, файл, файл, файл, файл, файл, файл и он также представляет собой каталог файлов* @param карты хранилища коллекции карты карты*/ public void listfile (файл файла, карта <string> map> map) {// Если файл представляет не файл, а каталог if (! Файл) .isfile ()) {// Перечислите все файлы и каталог в файлах каталога [] = file.listfiles (); map);}} else {/*** Имя файла обработки, загруженный файл переименован в форме имени файла uuid_ для переименования в части uuid_ file file.getName () Первая позиция «_» появилась в строке строки. ") +1 может получить _ вентилятор _ 达. Получает исходное имя файла. );}}
Вот краткий разговор о методе списка в списке. Каталог файла через форму запроса. и хранить, поэтому его необходимо использовать для рекурсии.
Настройка ListFileserVlet в файле web.xml
<Servlet> <vervlet-name> listfileservlet </servlet-name> <verlet-class> me.gac l.web.controller.listfileservlet </servlet-class> </servlet-mapping> <servlet-name> listfileservlet </ Servlet-name> <Url-pattern>/servlet/listfileservlet </url-pattern> </servlet-mapping>
Страница listfile.jsp файла загрузки следующая: следующее:
<%@ page language = "java" image = "java.util.*" pageencoding = "utf-8"%> <%@ taglib prefix = "c" uri = "http://java.sun.com/jsp /jstl/core " %> <! doctype html> <html> <head> <title> Страница отображения файла скачать файл </title> </head> <body> <!-Traversing Map Collection-> <C: foreach var = "Me" items = "$ {filenamemap}"> <c: url value = "/server/doubleservlet" var = "double"> <c: param name = "fileename =" $ {me.key} "> <// C: Param> </c: url> $ {me.value} <a href = "$ {doublel}"> Скачать </a> <br/> </c: foreach> </body> </html>
Посетите ListFileservlet, вы можете отобразить ресурсы файлов, предоставленные пользователю на странице ListFile.jsp, как показано на рисунке ниже ::
3.2
Напишите сервлет для обработки файлов.
Пакет Me.gacl.web.controller; ; GetParameter ("FilenAme"); в каталоге/web-inf/upload. Если файл не существует, если (! Xists ()) {request.setattribute («Сообщение», «Ресурсы, которые вы хотите загрузить, были удалены!»); Запрос, ответ); Encode (RealName, "UTF-8"); .getputStream (); (Buffer))> 0) {// Содержание выходного буфера в браузер, реализуйте файл загрузку out.write (буфер, 0, Len);} // Закройте поток ввода файла in.close (); / Закрыть выходной stream out.close ();}/ *** @method: findfilesavepathbyfilename* @description: Найдите путь файла в файл, который будет загружен с помощью имени файла и хранения файла root Directory* @anthor: e Загруженное имя файла* @param saverootpath Загрузите корневой каталог, сохраненный файлом, то есть каталог хранилища файлов, которые будут загружены/Web-Inf/upload Directory* @return в файл загрузки, чтобы быть загруженным*// Public String FileseppilEname (String FileName, S Tring SaverootPath) {int hashcode = filename.hashcode (); Dir = saveroolpath + "//" + dir1 + "//" // " + d ir2; )) {// Создать файл каталога.mkdirs ();} return dir;} public uest uest, httpservlesponse respons
Настроить DownloadServlet в файле web.xml
<Servlet> <servlet-name> downloadServlet </servlet-name> <verlet-class> me.g acl.web.controller.downloadservlet </servlet> </servlet> <servlet-mar-mar-map ping> <Servlet-name> downloadServlet </servlet-name> <Url-pattern>/servlet/downloadservlet </url-pattern> </servlet-mapping>
Нажмите [Скачать] Hyperlink, отправьте запрос на DownloadServlet для его обработки, вы можете загрузить файл.
Из результатов операции мы видим, что наша функция загрузки файла уже может загружать файл нормально.
Эта статья была составлена с «загрузкой Java загрузки операций», приветствуйте всех, кто учится и читает.
Есть так много содержимого о функциях загрузки и загрузки файлов в Javaweb.