导入对应jar包
- commons-fileupload-1.2.1.jar
用于Java Web开发中,用于处理来自客户端的文件上传到服务器。它提供了处理多部分/表单数据请求的支持,解析上传的文件并将它们存储在服务器上。 - commons-io-1.4.jar
提供了许多实用的工具类,用于处理文件、流、字节等。它包括了文件操作、流操作、文件过滤、文件比较、文件拷贝、文件读写等功能,使得在Java应用程序中处理文件和流变得更加简单和高效。 - servlet-api.jar
提供了JavaWeb所需要的一些基本类,用于处理请求和响应
编写页面
本次实验的测试页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>上传文件</title>
<style>
body {
font-family: Arial, sans-serif;
margin: 0;
padding: 0;
background-color: #f4f4f4;
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
}
form {
background-color: #fff;
padding: 20px;
border-radius: 5px;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
text-align: center;
}
input[type="file"] {
margin-bottom: 10px;
}
img {
margin-top: 10px;
display: block;
border: 1px solid #ccc;
border-radius: 5px;
max-width: 100px;
max-height: 100px;
}
</style>
</head>
<body>
<form action="FileUploadServlet" method="post" enctype="multipart/form-data">
<h2>上传图片</h2>
<input type="file" name="imgfile" id="file_input" onchange="show_image()">
<img src="" alt="" id="show_img"/>
<input type="submit" value="提交">
</form>
<script>
function show_image() {
var file_input = document.getElementById("file_input");
var show_img = document.getElementById("show_img");
show_img.src = window.URL.createObjectURL(file_input.files[0]);
}
</script>
</body>
</html>
编写Java代码实现文件上传
package com.hu.servlet;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import javax.servlet.ServletContext;
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 java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
@WebServlet("/FileUploadServlet")
public class FileUploadServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
//判断form表单是否设置了 enctype="multipart/form-data"
if (ServletFileUpload.isMultipartContent(req)) {
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload fileUpload = new ServletFileUpload(factory);
try {
List<FileItem> list = fileUpload.parseRequest(req);
//循环这俩个数据并处理
for (FileItem fileItem : list) {
//判断是否时普通表单项,还是上传的文件数据
if (fileItem.isFormField()) {
//处理普通表单项[文本数据]
//判断这个数据的名称是不是msg,如果是msg我们就对它做响应的处理
if ("msg".equals(fileItem.getFieldName())) {
//getString("utf-8")解决中文乱码问题
String msg = fileItem.getString("utf-8");
}
} else {
//处理上传文件
//getSize:用来判断是否选择了要上传的图片
if (fileItem.getSize() > 0) {
String name = fileItem.getName(); //获取图片名
int index = name.lastIndexOf(".");
String substring = name.substring(index);
String newfileName = System.currentTimeMillis() + substring;
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
String format = dateFormat.format(new Date());
//全局对象[上下文对象]
ServletContext context = this.getServletContext();
String realPath = context.getRealPath("/" + format);
File file = new File(realPath);
if (!file.exists()){
//如果文件不存在就创建此目录
file.mkdirs();
}
//上传图片
fileItem.write(new File(realPath,newfileName));
}
}
}
} catch (FileUploadException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
} else {
System.out.println("上传格式不正确");
}
}
}
注意点:
- 表单提交的时候必须设置 enctype=“multipart/form-data”
- 对表单上传的格式进行判断,判断文件上传的格式是否正确
- 通过ServletFileUpload对请求对象进行解析
- 最后通过FileItem对象将文件写入服务器