1. Анализ принципа загрузки файла
1. Необходимые предпосылки для загрузки файлов
а Метод формы должен быть
беременный Свойство Enctype формы должно быть типа Multipart/Form-Data.
Enctype Значение по умолчанию: приложение/x-www-form-urlencoded
Функция: сообщите серверу типу MIME текста запроса
Приложение/X-WWW-FORM-URLENCODED: Имя пользователя = ABC и пароль = 123
ServletRequest.getParameter (String name); Этот метод является методом, который специально считывает этот тип
Multipart/Form-Data:
2. Используйте компонент Commons-FileUpload для загрузки файлов
а Скопировать пакет JAR: Commons-FileUpload.jar Commons-IO.Jar
беременный Принцип реализации
3. Проблема с кодом мусора
а Мусорный код обычных полей
Fileitem.getString (string charset); Кодирование должно соответствовать клиенту
беременный Загруженное китайское имя файла искажено.
request.setcharacterencoding ("UTF-8"); Кодирование должно соответствовать клиенту
4. Конкретная реализация
Код для загрузки стойки регистрации. JSP выглядит следующим образом
<%@ page language = "java" import = "java.util.*" pageencoding = "utf-8"%> <! Doctype html public "-// w3c // dtd html 4.01 transitional // en"> <html> <Head> <title> upload </title> <meta http-equiv = "Head>" upload </title> <meta http-equiv = "haud>" Content = "no-cache"> <meta http-equiv = "cache-control" content = "no-cache"> <meta http-equiv = "истекает" content = "0"> <!-<link rel = "stylesse-teet" type = "text/css" href = "styles.css">-> </head> <broad> <форма action="${pageContext.request.contextPath}/servlet/UploadServlet3" method="post" enctype="multipart/form-data">name:<input name="name"/><br/>file1:<input type="file" name="f1"/><br/>file2:<input type="file" name="f2"/><br/>input type="submit" value = "upload"> </form> </body> </html>Фоночный код сервлета
пакет com.itheima.servlet; импорт java.io.file; импорт java.io.ioexception; импорт java.io.printwriter; import java.io.usupportedencodingexception; импорт java.util.list; import java.util.uuid; import javax.servlet.servletexcret; javax.servlet.http.httpservlet; импорт javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletrespons org.apache.commons.fileupload.fileuploadexception; import org.apache.commons.fileupload.disk.diskfileitemfactory; импорт org.apache.commons.fileupload.servlet.servletfileupload; импорт org..commons.filename Extends httpservlet {public void doget (httpservletrequest, httpservletresponse response) throws servletexception, ioexception {request.setcharacterencoding ("utf-8"); ouncemptontenttype ("text/html; charse = utf-8"); response.getWriter (); System.out.print (request.getRemoteAddr ()); Boolean ismultipart = ServletFileUpload.ismultipartContent (запрос); if (! Ismultipart) {Thress New Runtimeexception («Пожалуйста, проверьте свойство enctype of the form the with support with support with support wry-form-data»; DiskFileItemFactory (); ServletFileUpload parser = new ServletFileUpload (dfif); // parser.setfilesizemax (3*1024*1024); // Установить размер одного файла загрузки // parser.setsizecemax (6*1024*1024); // altle size lider wither uploading filesting filesting file {items = parser.parseRequest (request);} catch (fileuploadbase.filesizeLimitexeedException e) {out.write ("uploadfile превышает 3M"); return;} catch (fileUploadBase.sizelimitexeedexexception e) {out.Write ("Общий файл execeds 6m"); e) {e.printstacktrace (); Бросьте новое runtimeexception ("packse загрузить контент, пожалуйста, попробуйте еще раз");} // обработать запрошенное содержание if (items! = null) {for (item: items: items) {if (item.isformfield ()) {processformfield (item);} else {processuploadfield (item);}}} out.write ("Загрузил успешно! processUploadField(FileItem item) {try {String fileName = item.getName();//If(fileName!=null&&!fileName.equals("")){fileName = UUID.randomUUID().toString()+"_"+FilenameUtils.getName(fileName);//Extension String extension = Filenameutils.getextension (filename); // тип mime string contentype = item.getcontenttype (); if (contentype.startswith ("image/")) {// date now = new Date (); // dateformat df = new SimpleDateFormat ("yyyy-mm-dd"); // // string kandletmor Рассчитайте каталог хранилища в соответствии с хэшкодом имени файла string childdirectory = makechilddirectory (getservletcontext (). GetRealpath ("/web-inf/"), fileneme); String stordereRectoryPath = getServletContext (). GetRealpath ("/web-inf/" filestory kildirectory); Файл (storedirectoryPath); if(!storeDirectory.exists()){storeDirectory.mkdirs();}System.out.println(fileName);ite(new File(storeDirectoryPath+File.separator+fileName));//Delete temporary file}}} catch (Exception e) {throw new RuntimeException("Upload failed, please try again");}}// Рассчитайте сохраненную подкатарию Private String MakeChildDirectory (String RealPath, String FileName) {int hashcode = filename.hashcode (); int dir1 = hashcode & 0xf; // take 1 ~ 4 бита int dir2 = "hashcode & 0xf0) >> 4; // take 5 ~ 8 bits string ritorotor =" rycode & 0xf0) >> 4;//// 5 ~ 8 bits string ritorotor = "+dir -pileporator1+dir. file = new File (realPath, Directory); if (! file.exists ()) file.mkdirs (); return Directory;} private void processformfield (файл элемент) {string fieldname = item.getFieldNam New Runtimeexception ("Кодирование UTF-8 не поддерживается");} System.out.println (FieldName+"="+FieldValue);} public void Dopost (httpservletrequest, httpservletrespons5. Относительно временных документов
а Diskfileitemfactory
public void setRepository (файл репозитория): установите каталог, где временные файлы хранятся public void setsizethershold (int sizethreshold): установите размер кэша
беременный
При загрузке файлов используйте поток ввода -вывода для их обработки самостоятельно. Обязательно удалите временный файл после закрытия потока. Fileitem.delete ()
Рекомендуется использовать: fileitem.writer (файл f). Временные файлы будут удалены автоматически.
6. Ограничьте размер файла
а
ServletFileUpload.SetFileSizeMax (3*1024*1024); // Установить размер одной загрузки файла
беременный
ServletFileUpload.setSizeMax (6*1024*1024); // Общий ограничение размера при загрузке нескольких файлов
Выше приведен пример кода для загрузки файла реализации Commons FileUpload, введенной редактором. Я надеюсь, что это будет полезно для всех. Если у вас есть какие -либо вопросы, пожалуйста, оставьте мне сообщение, и редактор ответит всем вовремя. Большое спасибо за вашу поддержку сайту wulin.com!