При разработке системы веб -приложений функции загрузки файлов и загрузки являются очень часто используемыми функциями. Сегодня давайте поговорим о реализации функций загрузки и загрузки файлов в Javaweb.
1. Загрузите простой пример
JSP
<%@ page language = "java" import = "java.util.*" pageencoding = "utf-8"%> <! Doctype html public "-// w3c // dtd xhtml 1.0 transitional // en"> <html> <head> <meta http-equiv = "content-tent" content "; charset=UTF-8" /><title>File Upload and Download</title></head><body><form action="${pageContext.request.contextPath}/UploadServlet" enctype="multipart/form-data" method="post"> Upload user: <input type="text" name="username" /> <br /> Upload file 1: <input type="file" name = "file1" /> <br /> file upload file 2: <input type = "file" name = "file2" /> <br /> <input type = "Отправить" value = "upload" /> < /form> <br /> $ {requestScope.message} < /body> < /html>Сервис
public void Doget (httpservletrequest, httpservletresponse response), выбрасывает Servletexception, ioexception {try {// 1. Получить фабрику синхронизации DiskFileItemFactory Factory = new DiskFileItemFactory (); // 2. Получить анализатор ServletFileUpload upload = new ServletFileUpload (Factory); // 3. Определите тип формы загрузки if (! Upload.ismultipartContent (запрос)) {// Загрузить форму - это нормальная форма, затем получить данные традиционным способом и возврата; } // Чтобы загрузить форму, анализатор вызывается для анализа списка данных upload <fieTiTem> list = upload.parseRequest (request); // fileItem // транслировать список, чтобы получить объект первой загрузки данных Data Data FileItem для (FileItem Item: List) {if (item.isformfield ()) {// Что вы получаете, является нормальным элементом ввода nem = item.getfieldname (); // Получить имя значения ввода string string = item.getString (); System.out.println (name + "=" + value); } else {// Получить загрузку элемента ввода string fileName = item.getName (); // Получить загруженное имя файла c:/документы и настройки/thinkpad/desktop/1.txt filename = filename.substring (fileName.lastIndexof ("//")+1); InputStream in = item.getInputStream (); // Получить загруженные данные int len = 0; байтовый буфер [] = новый байт [1024]; // Каталог, используемый для сохранения загруженных файлов, должен запретить внешнему миру непосредственно получить непосредственный доступ string savePath = this.getServletContext (). GetRealPath ("/web-inf/upload"); System.out.println (SavePath); FileOutputStream OUT = new FileOutputStream (savePath + "/" + filename); // записать файл в каталог загрузки while ((len = in.read (buffer))> 0) {out.write (buffer, 0, len); } in.close (); out.close (); request.setattribute ("Сообщение", "Загрузить успех"); }}}} catch (Exception e) {request.setattribute ("message", "upload Faile"); e.printstacktrace (); }}2. Модифицированная функция загрузки:
Примечания:
1. Китайский искаженный код для загрузки имен файлов и китайский искаженный код для загрузки данных
upload.setheaderencoding ("UTF-8"); // Решение китайского искаженного кода для загрузки имен файлов
// Форма загружена для файла, кодирование запроса недействительна и может быть преобразована только вручную
1.1 value = new String (value.getBytes ("iso8859-1"), "UTF-8");
1.2 string value = item.getString ("UTF-8");
2. Чтобы обеспечить безопасность сервера, загрузки файлы должны быть размещены в каталогах, которые не могут быть доступны непосредственно в внешнем мире.
3. Чтобы предотвратить перезапись файла, для загрузки файла должно быть сгенерировано уникальное имя файла.
4. Чтобы предотвратить появление слишком большого количества файлов в каталоге, вам необходимо использовать хэш -алгоритм, чтобы разбить хранилище.
5. Чтобы ограничить максимальное значение загруженных файлов, вы можете использовать метод: ServletFileUpload.SetFileSizeMax (1024) и захват:
Fileuploadbase.filesizeLimitexedExexception исключение, чтобы дать удобные для пользователя подсказки
6. Если вы хотите убедиться, что временный файл удален, вы должны вызвать метод item.delete после обработки файла загрузки.
7. Чтобы ограничить тип загруженного файла: при получении загруженного имени файла определите, является ли имя суффикса законным.
8. Слушайте процесс загрузки файлов:
ServletFileUpload upload = new ServletFileUpload (Factory); upload.setProgressListener (new ProgressListener () {public void Update (Long PbytesRead, Long pcontentLength, int arg2) {System.out.println ("Размер файла:" + pcontentlength + ", в настоящее время обрабатывается:" + pbytesread);}}); 9. Динамически добавлять элементы ввода ввода на веб -страницу.
функция addInput () {var div = document.getElementById ("file"); var input = document.createElement ("input"); input.type = "file"; input.name = "filename"; var del = document.createElement ("input"); del.type = "кнопка"; del.value = "delete"; del.onclick = function d () {this.parentnode.parentnode.removechild (this.parentnode); } var innerDiv = document.createElement ("div"); innerdiv.appendchild (input); innerdiv.appendchild (del); div.appendchild (innerdiv); }Загрузить JSP:
<%@ page language = "java" import = "java.util.*" pageencoding = "UTF-8"%> <! Doctype html public "-// w3c // dtd html 4.01 transitional // en"> <html> <head> <title> jsp 'upload2 addInput () {var div = document.getElementById ("file"); var input = document.createElement ("input"); input.type = "file"; input.name = "filename"; var del = document.createElement ("input"); del.type = "кнопка"; del.value = "delete"; del.onclick = function d () {this.parentnode.parentnode.removechild (this.parentnode); } var innerDiv = document.createElement ("div"); innerdiv.appendchild (input); innerdiv.appendchild (del); div.appendchild (innerdiv); } </script> </head> <body> <form action = "" enctype = "mutlipart/form-data"> </form> <table> <tr> <td> ulload user: </td> <td> <Input = "text" name = "insememe"> </td> </tr> <td> <td> file: </td input> <td> <td> <td> <td> <td> <td> <td> <td> <td> <td> <td> <td> <td> <td> <td> <td> <td> <td> <td> <td> <td> <td> <td> <td> <td> value = "add upload file" onclick = "addInput ()"> </td> </tr> <tr> <td> </td> <td> <div id = "file"> </div> </td> </td> </tr> </table> </body> </html> </td> </tr> </table> </body> </html>Загрузить сервлет
открытый класс uploadservlet1 Extends httpservlet {public void doget (httpservletrequest -запрос, httpservletresponse response) Throws ServletException, ioException {//Request.getParameter("Username "); // **** refsure.setcharacterencoding ("UTF-8"); // Форма загружена для файла, а кодирование запроса является недействительным // Получить загруженный файл savePath = this.getServletContext (). GetRealPath ("/web-inf/upload"); try {diskfileitemfactory factory = new DiskFileItemFactory (); factory.setrepository (новый файл (this.getServletContext (). getRealPath ("/web-inf/temp"))); ServletFileUpload upload = new ServletFileUpload (Factory); /* upload.setprogresslistener(new progressListener () {public void update (long pbytesRead, long pcontentLength, int arg2) {System.out.println («Размер файла:« + pcontentlength + », в настоящее время обрабатывается:« + pbytesRead);}}}); // Решить китайский искаженный код загрузки имен файлов if (! Upload.ismultipartContent (request)) {// Получить данные традиционным способом возврата; } /*Upload.setFileSizeMax(1024); upload.setsizemax (1024*10);*/ list <fieleitem> list = opload.parserequest (request); Для (FileItem item: list) {if (item.isformfield ()) {// Данные обычных элементов ввода инкапсулируются в name fileItem name = item.getfieldname (); String value = item.getString ("UTF-8"); // value = new String (value.getBytes ("iso8859-1"), "UTF-8"); System.out.println (name + "=" + value); } else {// Файл загрузки инкапсулируется в строке fileitem fileName = item.getName (); // файлы, представленные разными браузерами, разные C: /a/b/1.txt 1.txt System.out.println (filename); if (filename == null || filename.trim (). equals ("")) {продолжение; } filename = filename.substring (fileName.lastIndexof ("//")+1); InputStream in = item.getInputStream (); String SaveFilename = MakeFilEname (имя файла); // Получить имя файла сохраненной строки RealSavePath = MakePath (SaveFilename, SavePath); // Получить файл Save Directory FileOutputStream OUT = new FileOutputStream (RealSavePath + "//" + saveFilename); байтовый буфер [] = новый байт [1024]; int len = 0; while ((len = in.read (buffer))> 0) {out.write (buffer, 0, len); } in.close (); out.close (); item.delete (); // Удалить временный файл}}} catch (fileuploadbase.filesizeLimitexedEdexception e) {e.printstacktrace (); request.setattribute ("Сообщение", "Файл превышает максимальное значение!!!"); request.getRequestDispatcher ("/message.jsp"). возвращаться; } catch (Exception e) {e.printstackTrace (); }} public String MakeFilEname (String FileName) {//2.jpg return uuid.randomuuid (). toString () + "_" + fileName; } public String MakePath (String FileName, String SavePath) {int hashcode = filename.hashcode (); int dir1 = hashcode & 0xf; // 0--15 int dir2 = (hashcode & 0xf0) >> 4; // 0-15 String dir = savePath + "//" + dir1 + "//" + dir2; // upload/2/3 upload/3/5 файл файла = новый файл (dir); if (! file.exists ()) {file.mkdirs (); } return dir; } public void Dopost (httpservletRequest, httpservletresponse response) Throws ServletException, ioException {Doget (запрос, ответ); }}3. Скачать функцию
// Перечислите все файлы загрузки на веб-сайте общедоступного класса ListFileservlet extends httpservlet {public void Doget (httpservletrequest, httpservletresponse response) Throws servletexception, ioexception {string filePath = this.getServletContext (). GetRealPath ("/web-inf/uplud"); Карта карта = new hashmap (); ListFile (новый файл (FilePath), Map); request.setattribute ("map", map); request.getRequestDispatcher ("/listfile.jsp"). } public void ListFile (файл файл, карта карты) {if (! file.ishile ()) {file file [] = file.listfiles (); для (файл f: файлы) {listfile (f, map); }} else {string realName = file.getName (). substring (file.getName (). indexof ("_")+1); //9349249849-88343-8344_a_fan_davi.avi map.put (file.getName (), realName); }} public void dopost (httpservletrequest -запрос, httpservletresponse response) throws servletexception, ioexception {Doget (запрос, ответ); }}JSP -дисплей
<%@ page language = "java" import = "java.util.*" pageencoding = "utf-8"%> <%@ taglib prefix = "c" uri = "http://java.sun.com/jsp/jstl/core"%> <! doctpe html public "// w3c // dtd htm htm.01. Transitional // en "> <html> <head> <title> my jsp 'listfile.jsp' Начальная страница </title> </head> <body> <c: foreach var =" me "epest =" $ {map} "> <c: url value ="/servlet/downloadservlet "var =" doupurl "> <c: param name =" fillename " value = "$ {me.key}"> </c: param> </c: url> $ {me.value} <a href = "$ {downUrl}"> Скачать </a> <br/> </c: foreach> </body> </html>Скачать обработку сервлета
Public Class DownloadServlet Extends httpservlet {public void doget (httpservletrequest -запрос, httpservletresponse response) Throws ServletException, ioException {String fileName = request.getParameter ("filename"); //23239283-92489-avatar.avi filename = new String (filename.getbytes ("iso8859-1"), "UTF-8"); String path = makepath (имя файла, this.getServletContext (). GetRealPath ("/web-inf/upload")); File file = new File (path + "//" + filename); if (! file.exists ()) {request.setattribute ("Сообщение", "Ресурс, который вы хотите скачать, был удален !!"); request.getRequestDispatcher ("/message.jsp"). возвращаться; } String realName = filename.substring (fileName.indexof ("_")+1); response.setheader («Содержимое-распределение», «Приложение; файл healename =" + urlencoder.encode (realName, "UTF-8")); FileInputStream in = new FileInputStream (path + "//" + filename); OutputStream out = response.getOutputStream (); байтовый буфер [] = новый байт [1024]; int len = 0; while ((len = in.read (buffer))> 0) {out.write (buffer, 0, len); } in.close (); out.close (); } public String MakePath (String FileName, String SavePath) {int hashcode = filename.hashcode (); int dir1 = hashcode & 0xf; // 0--15 int dir2 = (hashcode & 0xf0) >> 4; // 0-15 String dir = savePath + "//" + dir1 + "//" + dir2; // upload/2/3 upload/3/5 файл файла = новый файл (dir); if (! file.exists ()) {file.mkdirs (); } return dir; } public void Dopost (httpservletRequest, httpservletresponse response) Throws ServletException, ioException {Doget (запрос, ответ); }}Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.