下面我会详细讲解“jsp+servlet简单实现上传文件功能(保存目录改进)”的完整攻略。
1. 基本介绍
在Java Web开发中,如果需要实现文件上传功能,可以使用jsp+servlet技术实现。具体实现过程中需要用到JDK提供的multipart/form-data类型数据处理方式。下面我们来看看如何实现。
2. 实现步骤
- 一、创建html页面,页面中包含一个表单,用于上传文件,表单中需要指定form表单的enctype为multipart/form-data。
示例代码:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>文件上传</title>
</head>
<body>
<form action="FileUploadServlet" method="post" enctype="multipart/form-data">
<input type="file" name="f">
<input type="submit" value="上传">
</form>
</body>
</html>
注意:form表单action中的FileUploadServlet是一个后台servlet的路径,需要在后台中对应的servlet中处理文件上传请求。
- 二、在后台servlet中创建一个实现javax.servlet.http.Part接口的文件上传处理类,用于处理文件上传请求的中间件:
示例代码:
package com.example.servlet;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.UUID;
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,
maxFileSize = 1024 * 1024 * 5,
maxRequestSize = 1024 * 1024 * 20,
location = "E:/file/"
)
public class FileUploadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Part part = request.getPart("f");
if (part != null && part.getSize() > 0) {
InputStream inputStream = part.getInputStream();
String fileName = part.getSubmittedFileName();
String fileSuffix = fileName.substring(fileName.lastIndexOf("."));
String uuid = UUID.randomUUID().toString().replace("-", "");
fileName = uuid + fileSuffix;
String uploadPath = getServletContext().getRealPath("") + File.separator + "file" + File.separator + fileName;
Files.copy(inputStream, Paths.get(uploadPath));
part.delete();
}
}
}
以上示例代码中的MultipartConfig注解用于设置文件上传相关参数:
- fileSizeThreshold:最大缓冲区缓存大小,默认为0,即不缓存。
- maxFileSize:最大文件上传大小。
- maxRequestSize:最大请求大小。
-
location:上传文件的保存路径。如果不指定该值,则会默认保存在tomcat临时目录中。
-
三、运行该项目,访问前台上传文件页面,上传一个大小小于5MB的文件。在实现的例子中,上传的文件将会被存储在E:/file/目录下。
3. 注意事项
- 1.表单需要设置enctype为multipart/form-data。
- 2.实现servlet需要使用javax.servlet.http.Part接口,它是Servlet 3.0规范引入的新特性,所以需要使用Servlet 3.0或以上的版本。
- 3.通过getServletContext().getRealPath("")获取的是该项目在tomcat中的真实路径。在实际开发中,路径应该设置为可配置(例如:写入配置文件或者通过配置文件等方式对外提供),以便部署在其他tomcat服务器上时可以方便地修改该路径。
4. 示例说明
下面两个示例,分别演示了如何实现多文件上传和跨域上传。
示例一:多文件上传示例
在前台页面中添加多个文件上传框,修改servlet的处理代码部分,实现批量文件上传功能。
示例代码:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>文件上传</title>
</head>
<body>
<form action="FileUploadServlet" method="post" enctype="multipart/form-data">
<input type="file" name="f1"><br>
<input type="file" name="f2"><br>
<input type="file" name="f3"><br>
<input type="submit" value="上传">
</form>
</body>
</html>
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String uploadPath = getServletContext().getRealPath("") + File.separator + "file" + File.separator;
Collection<Part> parts = request.getParts();
for (Part part : parts) {
if (part != null && part.getSize() > 0) {
InputStream inputStream = part.getInputStream();
String fileName = part.getSubmittedFileName();
String fileSuffix = fileName.substring(fileName.lastIndexOf("."));
String uuid = UUID.randomUUID().toString().replace("-", "");
fileName = uuid + fileSuffix;
Files.copy(inputStream, Paths.get(uploadPath + fileName));
part.delete();
}
}
}
示例二:跨域上传示例
在前台页面中添加一个可跨域上传的文件上传框,修改servlet的处理代码部分,实现跨域上传功能。
示例代码:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>文件上传</title>
</head>
<body>
<form action="FileUploadServlet" method="post" enctype="multipart/form-data">
<input type="file" name="f"><br>
<input type="hidden" name="callback" value="http://localhost:8080/crossDomainTest.html">
<input type="submit" value="上传">
</form>
</body>
</html>
注意:在跨域上传中,需要在form表单中添加一个隐藏的callback参数,用于返回上传结果。
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String uploadPath = "E:/file/";
Part part = request.getPart("f");
if (part != null && part.getSize() > 0) {
InputStream inputStream = part.getInputStream();
String fileName = part.getSubmittedFileName();
String fileSuffix = fileName.substring(fileName.lastIndexOf("."));
String uuid = UUID.randomUUID().toString().replace("-", "");
fileName = uuid + fileSuffix;
String uploadFilePath = uploadPath + fileName;
Files.copy(inputStream, Paths.get(uploadFilePath));
part.delete();
String callbackUrl = request.getParameter("callback");
response.setContentType("application/json;charset=utf-8");
PrintWriter out = response.getWriter();
out.print("{\"code\": 0, \"info\": \"success\", \"fileName\": \"" + fileName + "\", \"fileUrl\": \"" + uploadFilePath + "\", \"callback\": \"" + callbackUrl + "\"}");
out.flush();
out.close();
}
}
在处理上传文件成功后,需要向前台返回一个json格式的信息,包含上传结果等详细信息。
以上就是“jsp+servlet简单实现上传文件功能(保存目录改进)”的完整攻略。希望对你有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:jsp+servlet简单实现上传文件功能(保存目录改进) - Python技术站