En Javaweb, subir y descargar es una función común. Para la carga de archivos, el navegador pasa el archivo al servidor en el proceso de cargar el archivo en un proceso de transmisión. En general, el paquete Commons-FileUppload se utiliza para implementar la función de carga. Debido a que Commons-FileUpload depende del paquete Commons-IO, debe descargar estos dos paquetes Commons-FileUpload-1.2.2.jar y commons-io-1.3.2.Jar.
1. Construir un entorno
Cree un proyecto web e importe el paquete al proyecto lib
2. Implementar la carga de archivos
(El primer método de carga)
Crea una nueva página de upload.jsp
<%@ page lenguaje = "java" contentType = "text/html; charset = utf-8" pageEncoding = "utf-8"%> <! DocType html público "-// w3c // dtd html 4.01 transición // en" " "http://www.w3.org/tr/html4/loose.dtd"><html><head><meta http-equiv =" content-type "content =" text/html; charset = utf-8 "> <title> archivo de carga </title> </head> <! La ruta absoluta al proyecto, lo que significa que no importa dónde copie el proyecto en el futuro, encontrará la ruta exacta-> <form de acción = "<%= request.getContextPath ()%>/uploadServlet" enctype = "multipart/form-data" método = "post"> <span> select file: </span> <input type = "file =" file1 "> <py type de input type =" subt "spangod" Subting "Subting" </form> </body> </html>
Cree un nuevo servlet que maneja la carga de archivos
paquete com.load; import java.io.file; import java.io.ioException; import java.util.list; import javax.servlet.servletContext; import javax.servlet.servletException; import javax.servlet.annotation.webservlet; import javax.servlet.http.httpservlet; importar; javax.servlet.http.httpservletRequest; import javax.servlet.http.httpServletResponse; importar org.apache.commons.fileUpload.fileitem; import org.apache.commons.fileupload.fileuploadexception; import org.apache.commons.fileupload.disk.diskFileItemFactory; import org.apache.commons.fileUpload.servlet.servletFileUpload; @WebServlet ("/uploadServlet") public ClassLoadSoadServlet extiende httPservlet {SERIESSUNDURSIONES LONGISTA LARGIO INFERMEDIO INFERIO = 1L; public uploadServlet () {super (); } /* En el paquete FileUpload, los elementos de formulario complejos en la solicitud HTTP se consideran como un objeto FileItem; * El objeto FileItem debe analizarse mediante el método parserequest () en la clase ServletFileUpload* (es decir, el objeto httpservletRequest envuelto), es decir, el formulario de texto específico y el archivo de carga están separados**/protegido void (htttpservletRequest solicitud, httpServeTletResponse Respuesta) ServletException, iPoid (htttpServletRetRequest Solicitud, httpServeTletResse) se separa ServletException, iPoid (htttpServletRequestRequest Solicitud, httpServletResse). Método ISMULTIPARTCONTENT (): Analice si hay solicitudes en archivos en la solicitud, boolean isMultipart = servletFileUpload.IsmultipartContent (solicitud); if (isMultipart) {// Cree una fábrica de nodo de disco establecible DiskFileItemFactory Factory = new DiskFileItemFactory (); // Obtener la información de contexto de la solicitud ServletContext ServletContext = request.getServletContext (); // Directorio de caché, cada repositorio de archivos de directorio específico del servidor = (archivo) servletContext.getAttribute ("javax.servlet.context.tempdir"); // establecer el directorio de caché del servidor fábrica.setRepository (repository); // La creación del objeto ServletFileUpload debe depender de FileItemFactory // La fábrica guarda el objeto FileItem de archivo de carga obtenido al disco duro del servidor, es decir, el objeto DiskFileItem. ServletFileUpload upload = new ServLetFileUpload (fábrica); Pruebe {// analice el objeto httpservletRequest después de estar envuelto, que es para separar los formularios de texto y cargar archivos (las solicitudes http se envolverán como httpservletrequest) list <stilitem> elementos = upload.parsequest (request); for (fileItem item: elementos) {String fieldName = item.getFieldName (); Cadena filename = item.getName (); Cadena contentType = item.getContentType (); boolean isinmemory = item.isinMemory (); larga tamañoinbytes = item.getSize (); // Instanciar un archivo // request.getRealPath (obtenga la ruta real) Archivo de archivo = nuevo archivo (request.getRealPath ("/")+"/Loads"+filename.substring (filename.lastIndexof ("//")+1, filename.length ())); item.write (archivo); }} Catch (FileUploadException e) {E.PrintStackTrace (); } catch (Exception e) {E.PrintStackTrace (); }}} protegido void dopost (solicitud httpservletRequest, respuesta httpservletResponse) arroja servletException, ioexception {doget (solicitud, respuesta); }}(El segundo método de carga)
Cree una nueva página JSP (igual que la anterior, solo se cambia la ruta)
<%@ page lenguaje = "java" contentType = "text/html; charset = utf-8" pageEncoding = "utf-8"%> <! DocType html público "-// w3c // dtd html 4.01 transición // en" " "http://www.w3.org/tr/html4/loose.dtd"><html><head><meta http-equiv =" content-type "content =" text/html; charset = utf-8 "> <title> archivo de carga </title> </head> <! La ruta absoluta al proyecto, lo que significa que no importa dónde copie el proyecto en el futuro, encontrará la ruta exacta-> <form de acción = "<%= request.getContextPath ()%>/uploadServlet1" enctype = "multipart/form-data" método = "post"> <span> select file: </span> <input type = "file" name = "file1"> <input type = "" Subting "SELL SELLED" Subting " </form> </body> </html>
Crear servlet para manejar la carga
paquete com.load; import java.io.file; import java.io.fileOutputStream; import java.io.ioException; import java.io.inputstream; import java.io.outputstream; import javax.servlet.servletexception; import javax.servlet.annotation.multipartconfig; import javax.servlet.annotation.webservlet; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservletRequest; import javax.servlet.http.htpservletResponse; import javax.servlet.http.part; @webservlet ("/uploadServlet1")@multipartconfig (ubicación = "") public class uploadServlet1 extiende httpservlet {private static final long SerialVersionUid = 1l; public uploadServlet1 () {super (); } protegido void dogget (httpservletRequest solicitud, respuesta httpservletResponse) arroja servletException, ioexception {respuesta.setContentType ("text/html; charset = utf-8"); request.setcharacterEncoding ("UTF-8"); // Obtener archivo de carga y leer la parte del archivo Parte = request.getPart ("file1"); // Defina una variable para recibir el nombre de archivo String filename = null; // Disposición de contenido: es proporcionar un nombre de archivo predeterminado cuando el usuario desea guardar el contenido solicitado como un archivo // contenido-disposición: dígale al navegador que abra el archivo descargando (string content: part.getheader ("content-disisposition"). Dividido (";")) {system.println (contenido); // Obtenga el nombre del archivo if (content.trim (). Startswith ("filename")) {// interceptar el nombre de archivo filename = content.substring (content.indexof ('=') + 1) .trim (). Reemplazar ("/" "," ");}} // outystream out = null; // input stream fileContent = nleLul Dividy Line y Otros de datos = nuevo FileOtputStream (nuevo archivo ("E:/Loads" + File.separator + FileName)); } System.out.println ("nuevo archivo" + nombre de archivo + "creado en" + "/loads");(El tercer método de carga)
El paquete JSPSMARTUPLOAD se usa aquí para cargar y descargar. El autor cree que este tipo de carga y descarga es relativamente simple, pero parece que muchas personas no lo usan y no lo entienden.
Crear página HTML
<! DOCTYPE HTML> <HTML> <HEAD> <meta http-equiv = "content-type" content = "text/html; charset = utf-8"> <title> Archivo de carga </title> </head> <body> <p> </p> <p Align = "Center"> Selección de archivo de carga </p> <p> Action = "../ doUPloadservlet" enctype = "multipart/form-data"> <table align = "center"> <tr> <td> <div align = "center"> 1. <input type = "file" name = "file1"> </div> </td> </tr> <tr> <tr> <td> <div align = "center"> 2. <input type = "file" file "name" name " </div> </td> </tr> <tr> <td> <div align = "centro"> 3. <input type = "file" name = "file3"> </div> </td> </tr> <tr> <td> <div align = "centro"> <input type = "enviar" name = "enviar" valor = "cargar him"> </iv> </td> </tr> TABLE </form> </body> </html>
Crear un servlet para procesar archivos de carga
paquete com.load; import java.io.ioException; import java.io.printwriter; import javax.servlet.servletException; import javax.servlet.annotation.webservlet; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservletRequest; import javax.servlet.http.httpServletResponse; import javax.servlet.jsp.jspfactory; import javax.servlet.jsp.pageContext; import com.jspsmart.upload.file; import com.jspsmart.upload.smartupload; import com.jspsmart.upload.smartuploadException; @Webservlet ("/douPloadservlet") public class downloadServlet extiende httpservlet {private static final long serialVersionUid = 1l; public downloadServlet () {super (); } protegido void dogget (httpservletRequest solicitud, respuesta httpservletResponse) arroja servletException, ioexception {respuesta.setContentType ("text/html; charset = utf-8"); PrintWriter out = Response.getWriter (); // crear un nuevo objeto de carga inteligente SmartUpload su = new SmartUpload (); / * * PageContext PageContext; Sesión de httpsession; Aplicación ServletContext; ServletCig config; Jspwriter fuera; Página de objeto = this; Solicitud de httpservletRequest, respuesta httpServletResponse donde el objeto, la solicitud y la respuesta de la página se han instanciado, mientras que los otros 5 objetos que no están instanciados se instancian de la siguiente manera pageContext = jspxFactory.getPageContext (esto, solicitud, respuesta, nula, verdadera, 8192, verdadero); */// Obtenga el entorno de contexto a través de la clase JSP de fábrica pageContext PageContext = jspFactory.getDefaultFactory (). GetPageContext (this, solicitud, respuesta, nulo, true, 8192, true); // cargar inicialize su.initialize (pageContext); // Cargar archivo intente {su.upload (); // Guardar el archivo de carga en el directorio especificado int count = su.save ("/share"); out.println (count+"¡Carga de archivo con éxito! <br>"+su.ToString ()); } Catch (SmartuploadException e) {E.PrintStackTrace (); } // extraer información de archivo de carga uno por uno para (int i = 0; i <su.getFiles (). GetCount (); i ++) {archivo file = su.getFiles (). GetFile (i); // Si el archivo no existe si (file.ismissing ()) continúa; // Mostrar información actual del archivo out.println ("<table border = 1>"); out.println ("<tr> <td> nombre del elemento de formulario (fieldName) </td> </td>"+file.getFieldName ()+"</td> </tr>"); out.println ("<tr> <td> longitud de archivo </td> <td>"+file.getSize ()+"</td> </tr>"); out.println ("<tr> <td> nombre de archivo </td> <td>"+file.getFileName ()+"</td> </tr>"); out.println ("<tr> <td> nombre de archivo </td> <td>"+file.getFileName ()+"</td> </tr>"); out.println ("<tr> <td> Extensión de archivo </td> <td>"+file.getFileExt ()+"</td> </tr>"); out.println ("<tr> <td> Nombre completo de archivo </td> <td>"+file.getFilePathName ()+"</td> </tr>"); out.println ("</tabla> <br>"); }} / ** * @see httpservlet#dopost (httpservletRequest solicitud, respuesta httpServletResponse) * / protegido void dopost (httpservletRequest solicitud, httpServletResponse respuesta) lanza ServletException, ioexception {// TODO AUTO GENERADO DOGGET (Solicitud, respuesta, respuesta); }} Nota: el código int count = su.save ("/share"); Significa que primero debe crear una carpeta, por lo que primero puede crear uno en Webcontent, luego deshacer el proyecto y luego volver a implementarla, ¡se creará una carpeta en el lado de ejecución!
O puede encontrar directamente la ruta para ejecutar y crear la carpeta Compartir.
3. Realice la descarga de archivos
(Primer archivo de descarga)
Nota: Este código accede directamente a la clase Servlet
paquete com.load; import java.io.fileInputStream; import java.io.ioException; import java.io.inputstream; import java.io.outputstream; import javax.servlet.servletException; import javax.servlet.annotation.webservlet; import javax.servlet.http.httPservlet; javax.servlet.http.httpservletRequest; import javax.servlet.http.httpservletResponse; // use directamente http: // localhost: 8080/test1/descargar para descargar, pero esto es defectuoso. Si hay chino en el nombre del archivo de descarga, ¡se volverá confuso! @WebServlet ("/descargar") la descarga de clase pública extiende httpservlet {private static final long serialversionUid = 1l; descarga public () {super (); } protegido void dogget (httpservletRequest solicitud, respuesta httpservletResponse) lanza ServletException, ioexception {Response.setContentType ("Text/Plain; Charset = UTF-8"); respuesta.setcharacterEncoding ("UTF-8"); respuesta.setheader ("ubicación", "chino.txt"); Respuesta.setheader ("Disposición de contenido", "Adjunto; FileName =" + "Account.txt"); OutputStream OutputStream = Response.getOutputStream (); InputStream InputStream = new FileInputStream ("E:/Loads"+"/Account.txt"); byte [] buffer = new Byte [1024]; int i = -1; while ((i = inputStream.read (buffer))! = -1) {outputStream.Write (buffer, 0, i); } outputStream.Flush (); outputStream.close (); } protegido void dopost (httpservletRequest solicitud, respuesta httpservletreSponse) lanza ServletException, ioexception {doget (solicitud, respuesta); }}(El segundo método de descarga)
Crear una nueva página JSP y seleccionar descargar
<%@ page lenguaje = "java" contentType = "text/html; charset = utf-8" pageEncoding = "utf-8"%> <! DocType html público "-// w3c // dtd html 4.01 transición // en" " "http://www.w3.org/tr/html4/loose.dtd"> podet href = "../ DodownloadServlet? FileName = jeje.txt"> Haga clic para descargar </a> </body> </html>
Cree una clase de servlet para descargar (Nota: si el nombre del archivo de esta descarga es chino, aún causará código confuso)
paquete com.load; import java.io.bufferedInputStream; import java.io.file; import java.io.fileInputStream; import java.io.ioexception; import java.io.inputStream; import java.io.outputstream; import java.net.urlencoder; javax.servlet.annotation.webservlet; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservletRequest; import javax.servlet.http.httpservletRetRessons; import javax.servlet.jsp.jspfactory; import; javax.servlet.jsp.pageContext; import org.hsqldb.lib.stringutil; import com.jspsmart.upload.smartupload; import com.jspsmart.upload.smartuploadexception; @webservlet ("/dodownloadServlet) SerialVersionUid = 1L; public dodownloadServlet () {super (); } Proteged void doget (httpservletRequest solicitud, respuesta httpservletResponse) lanza ServletException, ioexception {// obtiene el nombre del archivo descargado // string filename = request.getParameter ("fileName"); // string filename = new String (FileName.getBytes ("ISO8859-1"), "UTF-8"); // Cree un nuevo objeto SmartUpload SmartUpload su = new SmartUpload (); PageContext PageContext = jspFactory.getDefaultFactory (). GetPageContext (this, solicitud, respuesta, nulo, true, 8192, true); // cargar inicialización su.initialize (pageContext); // Establecer la apertura de Prohibit del archivo su.setContentDisposition (NULL); // Descargar archivo intente {su.downloadfile ("/oyente/"+nombre de archivo); } Catch (SmartUploadException e) {// TODO Auto Generated Catch Block E.PrintStackTrace (); }} protegido void dopost (solicitud httpservletRequest, httpservletResponse respuesta) arroja servletException, ioexception {doget (solicitud, respuesta); }}(El tercer método de descarga)
El mismo código de página JSP que el anterior no se repetirá aquí.
Cree una nueva clase Serlvet para implementar la función de descarga (nota: ¡Incluso si el nombre del archivo es un nombre chino, no habrá problemas confusos!)
paquete com.load; import java.io.bufferedInputStream; import java.io.file; import java.io.fileInputStream; import java.io.ioexception; import java.io.inputStream; import java.io.outputstream; import java.net.urlencoder; javax.servlet.annotation.webservlet; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservletRequest; import javax.servlet.http.httpservletRetRessons; import javax.servlet.jsp.jspfactory; import; javax.servlet.jsp.pageContext; import org.hsqldb.lib.stringutil; import com.jspsmart.upload.smartupload; import com.jspsmart.upload.smartuploadexception; @webservlet ("/dodownloadServlet) SerialVersionUid = 1L; public dodownloadServlet () {super (); } Proteged void doget (httpservletRequest solicitud, httpservletResponse respuesta) lanza ServletException, ioexception {// obtenga el nombre de archivo string path1 = request.getParameter ("FileName"); // Get Path Name String Path = request.getSession (). GetServletContext (). GetRealPath ("/Listener/"+Path1); // La ruta es un archivo empalmado en función de la ruta del registro y el nombre del archivo. Cadena filename = file.getName (); Pruebe {// juzga si es ie11 boolean flag = request.getheader ("user-agent"). indexOf ("como gecko")> 0; // Ie11 String de usuario-agente: Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; RV: 11.0) como gecko // ie6 ~ ie10 Version-Agent String: Mozilla/5.0 (Compatible; MSIE 10.0; Windows NT 6.0; Trident/6.0) si (request.getheader ("user-agent"). tOlowerCase (). indexOf ("msie")> 0 || flag) {filename = urlencoder.encode (nombre de archivo, "utf-8"); // ie browser} else {// elimina los espacios en el nombre del archivo y luego se convierte en el formato de envío a UTF-8 para garantizar que no hay el código de barbitado. // Este nombre de archivo se usa para el nombre del archivo que se muestra automáticamente en el cuadro de descarga del navegador FileName = new String (FileName.replaceAll ("", "") .getBytes ("UTF-8"), "ISO8859-1"); // navegador Firefox // String de user-agent de Firefox: //mozilla/5.0 (Windows NT 6.1; WOW64; RV: 36.0) Gecko/20100101 Firefox/36.0} InputStream FIS = New BuffeDInputStream (nuevo FileInputStream (ruta)); byte [] búfer; buffer = new Byte [Fis.available ()]; fis.read (búfer); fis.close (); respuesta.reset (); Respuesta.AddHeader ("Disposición de contenido", "Adjunto; FileName =" +FileName); Respuesta.AddHeader ("Content-Length", "" + file.length ()); OutputStream OS = Response.getOutputStream (); respuesta.setContentType ("Application/Octet-stream"); OS.Write (buffer); // Archivo de salida OS.Flush (); os.close (); } catch (ioException e) {E.PrintStackTrace (); } System.out.println (nombre de archivo); } protegido void dopost (httpservletRequest solicitud, respuesta httpservletreSponse) lanza ServletException, ioexception {doget (solicitud, respuesta); }}Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.