您的位置:首页 > Web前端 > JavaScript

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

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-data
POST 请求中接收的一部分或表单部件。一些重要的方法有
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 目录,你将会得到不同的更清晰的结构。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java web
相关文章推荐