Servlet JSP Tutorial -- 1.9 Servlet 3 File Upload using MultipartConfig annotation & Part interface
2018-01-15 12:27
645 查看
今天我们将使用 @MultipartConfig 注解和 javax.servlet.http.Part 来研究 Servlet 3 文件上传示例。之前我写了一篇关于Servlet文件上传的文章,我使用了 Apache FileUpload API,但是在这里我们将使用 Servlet 3 实现文件上传功能。
Servlet 3 File Upload
1. MultipartConfig
2. Part Interface
3. HttpServletRequest Changes
4. HTML Form
5. File Upload Servlet
6. Response JSP
7. Deployment Descriptor
阅读更多关于 Java Annotation:Java Annotations Tutorial.
让我们看一个简单的项目,我们将使用上面的 API 方法来使用servlet 上传文件。 我们的项目结构将如下图所示。
注意使用
目录位置时相对于我保存文件的 Web 应用程序而言,你可以将其配置到其他位置如 Apache Commons FileUpload 示例中的位置。
现在,当我们运行应用程序时,我们得到下面的页面作为响应。
日志将显示保存文件的目录位置和
我通过 IDEA 运行 Tomcat,这就是为什么位置是这样的。如果你通过 command line 并通过 WAR 文件部署应用到 webapps 目录,你将会得到不同的更清晰的结构。
Servlet 3 File Upload
1. MultipartConfig
2. Part Interface
3. HttpServletRequest Changes
4. HTML Form
5. File Upload Servlet
6. Response JSP
7. Deployment Descriptor
Servlet 3 File Upload
由于文件上传时 Web 应用程序中的常见任务,因此Servlet 3.0规范提供了将文件上传到服务器的额外支持,我们不必再依赖于任何第三方 API。在本教程中,我们将看到如何使用
Servlet 3.0 API将文件上传到服务器。
MultipartConfig
我们需要使用MultipartConfig来注解文件上传处理程序 servlet 来处理用于上传文件到服务器的
multipart/form-data请求。MultipartConfig 注解具有以下属性:
fileSizeThreshold:我们可以指定文件将被写入磁盘的大小阈值。值得单位时字节。所以 1024 * 1024 * 10 是10MB。
location:默认情况下将存储文件的目录,默认值为”“。
maxFileSize:允许上传的最大文件大小,其值时以字节为单位的。默认值是
-1L表示无限制
maxRequestSize: 允许
multipart/form-data请求的最大大小。默认值是-1L,表示无限制。
阅读更多关于 Java Annotation:Java Annotations Tutorial.
Part Interface
Part 接口表示在multipart/form-dataPOST 请求中接收的一部分或表单部件。一些重要的方法有
getInputStream(),
write(String fileName),我们可以用来读写文件。
HttpServletRequest Changes
在HttpServletRequest中添加了新的方法,通过
getParts()方法获取
multipart/form-data请求中的所有部分。我们可以使用
getPart(String partName)方法来获取特定部分。
让我们看一个简单的项目,我们将使用上面的 API 方法来使用servlet 上传文件。 我们的项目结构将如下图所示。
HTML Form
我们有一个用于选择并上传提交请求来让服务器获取上传的简单 HTML 页面。index.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="FileUploadServlet" method="post" enctype="multipart/form-data"> Select File to Upload:<input type="file" name="fileName"> <br> <input type="submit" value="Upload"> </form> </body> </html>
File Upload Servlet
File Upload Servlet 实现FileUploadServlet.java
package com.journaldev.servlet; import java.io.File; import java.io.IOException; 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.HttpServletResponse; import javax.servlet.http.Part; @WebServlet("/FileUploadServlet") @MultipartConfig(fileSizeThreshold = 1024 * 1024 * 10, // 10 MB maxFileSize = 1024 * 1024 * 50, // 50 MB maxRequestSize = 1024 * 1024 * 100) // 100 MB public class FileUploadServlet extends HttpServlet { private static final long serialVersionUID = 205242440643911308L; /** * Directory where uploaded files will be saved, its relative to * the web application directory. */ private static final String UPLOAD_DIR = "uploads"; protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); // gets absolute path of the web application String applicationPath = request.getServletContext().getRealPath(""); // constructs path of the directory to save uploaded file String uploadFilePath = applicationPath + File.separator + UPLOAD_DIR; // creates the save directory if it does not exists File fileSaveDir = new File(uploadFilePath); if (!fileSaveDir.exists()) { fileSaveDir.mkdirs(); } System.out.println("Upload File Directory=" + fileSaveDir.getAbsolutePath()); String fileName = null; //Get all the parts from request and write it to the file on server for (Part part : request.getParts()) { fileName = getFileName(part); part.write(uploadFilePath + File.separator + fileName); } request.setAttribute("message", fileName + " File uploaded successfully!"); getServletContext().getRequestDispatcher("/response.jsp").forward( request, response); } /** * Utility method to get file name from HTTP header content-disposition */ private String getFileName(Part part) { String contentDisp = part.getHeader("content-disposition"); System.out.println("content-disposition header= " + contentDisp); String[] tokens = contentDisp.split(";"); for (String token : tokens) { if (token.trim().startsWith("filename")) { return token.substring(token.indexOf("=") + 2, token.length() - 1); } } return ""; } }
注意使用
@MultipartConfig注解来指定上传文件的不同大小参数。我们需要使用请求头
content-disposition属性来获取客户端发送的文件名,保存同名的文件。
目录位置时相对于我保存文件的 Web 应用程序而言,你可以将其配置到其他位置如 Apache Commons FileUpload 示例中的位置。
Response JSP
一旦将文件成功上传到服务器,一个简单的 JSP 页面将作为响应发送给客户端。response.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Upload File Response</title> </head> <body> <%-- Using JSP EL to get message attribute value from request scope --%> <h2>${requestScope.message}</h2> </body> </html>
Deployment Descriptor
在 web.xml 文件中没有什么新东西,它只是用来使 index.html 成为 welcome file。<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> <display-name>ServletFileUploadExample</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> </welcome-file-list> </web-app>
现在,当我们运行应用程序时,我们得到下面的页面作为响应。
日志将显示保存文件的目录位置和
content-disposition header信息。
Upload File Directory=C:\Users\Oktfolio\IdeaProjects\journaldev\ServletFileUploadExample\out\artifacts\ServletFileUploadExample_war_exploded\uploads content-disposition header= form-data; name="fileName"; filename="常用端口.jpg"
我通过 IDEA 运行 Tomcat,这就是为什么位置是这样的。如果你通过 command line 并通过 WAR 文件部署应用到 webapps 目录,你将会得到不同的更清晰的结构。
相关文章推荐
- Servlet JSP Tutorial -- 1.8 Servlet Upload File and Download File Example
- getServletConfig().getServletContext().getRequestDispatcher("xxx.jsp")的用法
- Handling Form-based File Upload with Java Servlet or JSP
- java jsp servlet fileupload上传图片时获取上传图片尺寸(宽高)的代码
- Java Servlet Filter tutorial example using Eclipse & Tomcat
- getServletConfig().getServletContext().getRequestDispatcher("xxx.jsp")的用法
- A Better File Upload Progress Bar using Python, AJAX Prototype, & JSON
- MultipartHttpServletRequest,ajaxFileUpload上传文件,读取文件乱码问题
- How to upload a file via a HTTP multipart request in Java without using any external libraries
- Upload a web.config File for Fun & Profit
- ServletFileUpload、MultipartRequest与MultipartParser的区别
- 遇到问题-----uploadify上传文件ServletFileUpload.isMultipartContent(request)为false
- Servlet.service() for Servlet jsp threw exception javax.servlet.ServletException:File &quot;/pageFoo
- jspsmartupload上传出现com.jspsmart.upload.SmartUploadException: File can't be saved (1120).
- jbpm 错误 loader constraint violation: when resolving interface method "javax.servlet.jsp.JspApplicationContext.getExpressionFacto
- Servlet.service() for Servlet jsp threw exception javax.servlet.ServletException:File "/pageFoo
- jsp+servlet+ajaxfileupload.js 实现异步上传
- Android: Upload image or file using http POST multi-part
- Upload file to servlet without using HTML form
- JSP+Servlet使用commons.fileupload和commons.io完成图片上传