English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Servlet se puede usar junto con el etiqueta HTML form para permitir que los usuarios carguen archivos al servidor. Los archivos que se cargan pueden ser archivos de texto, archivos de imágenes o cualquier tipo de documento.
Los archivos utilizados en este artículo son:
upload.jsp: Formulario de carga de archivos.
message.jsp: Página de redirección después de la carga exitosa.
UploadServlet.java: Servlet de procesamiento de carga.
Los archivos jar que deben incluir: commons-fileupload-1.3.2、commons-io-2.5.jar.
El diagrama de estructura se muestra a continuación:
Atención:Servlet3.0 ya tiene integrado la función de carga de archivos, por lo que los desarrolladores ya no necesitan importar el componente Commons FileUpload al proyecto.
A continuación, lo explicamos en detalle.
El siguiente código HTML crea un formulario de carga de archivos. Estos son los puntos que deben tenerse en cuenta:
表单 método 属性应该设置为 POST Método, no se puede usar el método GET.
表单 enctype 属性应该设置为 multipart/form-data.
表单 action 属性应该设置为在后端服务器上处理文件上传的 Servlet 文件。下面的示例使用了 UploadServlet Servlet 来上传文件。
上传单个文件,您应该使用单个带有属性 type="file" 的 <input .../> 标签。为了允许多个文件上传,请包含多个 name 属性值不同的 input 标签。输入标签具有不同的名称属性的值。浏览器会为每个 input 标签关联一个浏览按钮。
upload.jsp 文件代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> !DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>文件上传示例 - 基础教程网</title> </head> <body> <h1>文件上传示例 - 基础教程网</h1> <form method="post" action="/TomcatTest/UploadServlet" enctype="multipart/form-data"> 选择一个文件: <input type="file" name="uploadFile" /> <br/><br/> <input type="submit" value="上传" /> </form> </body> </html>
以下是 UploadServlet 的源代码,用于处理文件上传,在这之前我们先确保依赖包已经引入到项目的 WEB-INF/lib 目录下:
下面的示例依赖于 FileUpload,所以一定要确保在您的 classpath 中有最新版本的 commons-fileupload.x.x.jar 文件。可以从 http://commons.apache.org/proper/commons-fileupload/ 下载。
FileUpload 依赖于 Commons IO,所以一定要确保在您的 classpath 中有最新版本的 commons-io-x.x.jar 文件。可以从 http://commons.apache.org/proper/commons-io/ 下载。
你可以直接下载本站提供的两个依赖包:
UploadServlet 的源代码如下所示:
package com.w;3codebox.test; import java.io.File; import java.io.IOException; import java.io.PrintWriter; import java.util.List; 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 org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; /** * Clase de implementación de servlet ServletImplementationClass UploadServlet */ @WebServlet("/UploadServlet) public class UploadServlet extends HttpServlet { private static final long serialVersionUID = 1L; // Directorio de almacenamiento de archivos de subida private static final String UPLOAD_DIRECTORY = "upload"; // Configuración de subida private static final int MEMORY_THRESHOLD = 1024 * 1024 * 3; // 3MB private static final int MAX_FILE_SIZE = 1024 * 1024 * 40; // 40MB private static final int MAX_REQUEST_SIZE = 1024 * 1024 * 50; // 50MB /** * Subir datos y guardar archivos */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // Detectar si es una carga de archivos multimedia if (!ServletFileUpload.isMultipartContent(request)) { // Si no, detenerse} PrintWriter writer = response.getWriter(); writer.println("Error: La formulario debe contener enctype=multipart/form-data"); writer.flush(); return; } // Configurar los parámetros de subida DiskFileItemFactory factory = new DiskFileItemFactory(); // Establecer el valor crítico de la memoria - Después de lo cual se generará un archivo temporal y se almacenará en el directorio temporal factory.setSizeThreshold(MEMORY_THRESHOLD); // Establecer el directorio de almacenamiento temporal factory.setRepository(new File(System.getProperty("java.io.tmpdir"))); ServletFileUpload upload = new ServletFileUpload(factory); // Establecer el valor máximo de subida de archivo upload.setFileSizeMax(MAX_FILE_SIZE); // Establecer el valor máximo de la solicitud (incluso datos de archivo y formulario) upload.setSizeMax(MAX_REQUEST_SIZE); // Manejo de caracteres chinos upload.setHeaderEncoding("UTF-8"); // Construir una ruta temporal para almacenar los archivos subidos // Esta ruta es relativa al directorio de la aplicación actual String uploadPath = request.getServletContext().getRealPath("./) + File.separator + UPLOAD_DIRECTORY; // Si el directorio no existe, crearlo File uploadDir = new File(uploadPath); if (!uploadDir.exists()) { uploadDir.mkdir(); } try { // Analizar el contenido de la solicitud para extraer los datos del archivo @SuppressWarnings("unchecked") List<FileItem> formItems = upload.parseRequest(request); if (formItems != null && formItems.size() > 0) { // Iterate through form data for (FileItem item : formItems) { // Handle fields not in the form if (!item.isFormField()) { String fileName = new File(item.getName()).getName(); String filePath = uploadPath + File.separator + fileName; File storeFile = new File(filePath); // Output the file upload path in the console System.out.println(filePath); // Save the file to the hard disk item.write(storeFile); } "File upload successful!"); } } } catch (Exception ex) { } request.setAttribute("message", + "Error information: " } // ex.getMessage()); Redirect to message.jsp/request.getServletContext().getRequestDispatcher(" request, response); } }
message.jsp file code is as follows:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> !DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>File upload result</title> </head> <body> <center> <h2${message}</h2> </center> </body> </html>
Compile the Servlet UploadServlet above and create the required entries in the web.xml file as follows:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <servlet> <display-name>UploadServlet</display-name> <servlet-name>UploadServlet</servlet-name> <servlet-class>com.w3codebox.test.UploadServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>UploadServlet</servlet-name> <url-pattern>/TomcatTest/UploadServlet</url-pattern> </servlet-mapping> </web-app>
Ahora intente usar el formulario HTML creado anteriormente para subir archivos. Al acceder en el navegador a://localhost:8080/TomcatTest/upload.jsp, como se muestra a continuación: