在本章中,我们将讨论和学习如何在JSP中的文件上传。 JSP可以与HTML表单标签一起使用,以允许用户将文件上传到服务器。上传的文件可以是文本文件或二进制文件或图像文件,也可以是任何文档。
为了方便演示,首先打开Eclipse创建一个动态Web项目:UploadFile ,其目录结构如下所示 -
现在来看看如何创建一个文件上传表单。 以下HTML代码创建一个上传器表单。 以下是要注意的重点 -
method
属性应设置为POST
方法,不能使用GET
方法。enctype
属性应设置为multipart/form-data
。action
属性应该设置为一个JSP文件,它将处理后端服务器上的文件上传。 以下示例 - 使用uploadhandle.jsp
程序处理上传文件。要上传单个文件,应该在单个<input ... />
标签中指定使用type ="file"
属性。 要允许多个文件上传,请将name
属性包含多个具有不同值的输入标记。浏览器将浏览按钮与每个浏览器相关联。
文件:selectFile.html
文件代码如下 -
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>文件上传示例</title> </head> <body> <div style="margin: auto; width: 80%;"> <h3>文件上传示例</h3> 选择要上传的文件: <form action="uploadhandle.jsp" method="post" enctype="multipart/form-data"> <input type="file" name="file" size="50" /><input type="submit" value="提交上传" /> </form> </div> </body> </html>
这将显示以下结果。现在可以从本地电脑选择一个文件,并且当用户单击“上传文件”时,表单将随所选文件一起提交 -
注意 - 上面的表单只是虚拟表单,不起作用,要处理上传还需要编写JSP相关处理文件上传的程序。
现在定义一个存储上传文件的位置。可以在程序中对此进行硬编码,也可以使用外部配置(如web.xml中的context-param
元素)添加此目录名称,如下所示:
以下是uploadFile.jsp
的源代码。这可以一次处理多个文件的上传。 在继续上传文件之前,需要考虑以下几点:
FileUpload
类库; 确保类路径中有最新版本的commons-fileupload.x.x.jar
文件(可以从 http://commons.apache.org/fileupload/ 下载)。FileUpload
类库依懒于Commons IO
;确保类路径中有最新版本的commons-io-x.x.jar
文件(可以从 http://commons.apache.org/io/ 下载)。maxFileSize
,否则文件将不会被上传。文件:uploadhandle.jsp 的代码实现如下 -
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="java.io.*,java.util.*, javax.servlet.*"%> <%@ page import="javax.servlet.http.*"%> <%@ page import="org.apache.commons.fileupload.*"%> <%@ page import="org.apache.commons.fileupload.disk.*"%> <%@ page import="org.apache.commons.fileupload.servlet.*"%> <%@ page import="org.apache.commons.io.output.*"%> <% File file; int maxFileSize = 5000 * 1024; int maxMemSize = 5000 * 1024; ServletContext context = pageContext.getServletContext(); //String filePath = context.getInitParameter("file-upload"); String filePath = request.getSession().getServletContext().getRealPath(""); //String filePath = request.getContextPath(); System.out.println("filePath => " + filePath); // Verify the content type String contentType = request.getContentType(); if (contentType == null) { System.out.println("contentType => " + contentType); contentType = ""; } if ((contentType.indexOf("multipart/form-data") >= 0)) { DiskFileItemFactory factory = new DiskFileItemFactory(); // maximum size that will be stored in memory factory.setSizeThreshold(maxMemSize); // Location to save data that is larger than maxMemSize. factory.setRepository(new File("c:\\temp")); // Create a new file upload handler ServletFileUpload upload = new ServletFileUpload(factory); // maximum file size to be uploaded. upload.setSizeMax(maxFileSize); try { // Parse the request to get file items. List fileItems = upload.parseRequest(request); // Process the uploaded file items Iterator i = fileItems.iterator(); out.println("<html>"); out.println("<head>"); out.println("<title>JSP File upload</title>"); out.println("</head>"); out.println("<body>"); while (i.hasNext()) { FileItem fi = (FileItem) i.next(); if (!fi.isFormField()) { // Get the uploaded file parameters String fieldName = fi.getFieldName(); String fileName = fi.getName(); boolean isInMemory = fi.isInMemory(); long sizeInBytes = fi.getSize(); // Write the file if (fileName.lastIndexOf("\\") >= 0) { file = new File(filePath + fileName.substring(fileName.lastIndexOf("\\"))); } else { file = new File(filePath + fileName.substring(fileName.lastIndexOf("\\") + 1)); } fi.write(file); out.println("Uploaded Filename: " + filePath + fileName + "<br>"); } } out.println("</body>"); out.println("</html>"); } catch (Exception ex) { System.out.println(ex); } } else { out.println("<html>"); out.println("<head>"); out.println("<title>Servlet upload</title>"); out.println("</head>"); out.println("<body>"); out.println("<p>No file uploaded</p>"); out.println("</body>"); out.println("</html>"); } %>
现在尝试使用上面创建的HTML表单上传文件。部署项目后,打开浏览器访问URL: http://localhost:8080/UploadFile/selectFile.html
时将显示以下结果。
如果编写的JSP脚本工作正常,选择的文件应该上传到项目的根目录中。