一、文件上传介绍
1. method请求必须为post
2. enctype属性值必须为multipart/form-data
3. input 类型为type="file"
1.表单提交上传
<form action="/aaa/fileUpload.jsp" enctype="multipart/form-data" method="post">
<input type="text" name="username">
<br><br>
<input type="file" name="fileData">
<br><br>
<button type="submit">提交文件</button>
</form>
提交表单上传,会刷新界面,一般不推荐 ,建议使用Ajax异步提交文件上传信息。
2.AJAX提交上传
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.js"></script>
<div>
上传文件: <input type="file" onchange="uploadFile(this)">
</div>
<script>
function uploadFile(event) {
var File = event.files[0];
var formData = new FormData();
formData.append("username", "测试账号123")
formData.append("file", File)
$.ajax({
url: '/aaa/fileUpload.jsp',
type: 'post',
data: formData,
contentType: false,
processData: false,
success: function (result) {
console.log(result)
},
error: function (err) {
console.log(err)
}
});
}
</script>
二、请求头分析
multipart/form-data 是基于post方法来传递数据的,并且其请求内容格式为Content-Type: multipart/form-data,用来指定请求内容的数据编码格式。另外,该格式会生成一个boundary字符串来分割请求头与请求体。
三、Java解析代码
1.自己解析流
request.getInputStream();可以看看这篇文章
解析request.getInputStream()http://t.csdn.cn/TCm7T
2.标准解析流
commons-fileupload.jar需要依赖commons-io.jar 这个包,所以两个包我们都要引入。
具体使用方法见如下代码:
<%@ page import="org.apache.commons.fileupload.servlet.ServletFileUpload" %>
<%@ page import="org.apache.commons.fileupload.disk.DiskFileItemFactory" %>
<%@ page import="org.apache.commons.fileupload.FileItemFactory" %>
<%@ page import="org.apache.commons.fileupload.FileItem" %>
<%@ page import="java.util.List" %>
<%@ page import="java.io.File" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
//判断是否是多段数据(只有是多段数据才是文件上传)
//多段数据返回true,否则返回false
if (ServletFileUpload.isMultipartContent(request)) {
//创建FileItemFactory工厂实现类
FileItemFactory factory = new DiskFileItemFactory();
//创建用于解析数据的工具类ServletFileUpload类
ServletFileUpload servletFileUpload = new ServletFileUpload(factory);
//设置编码格式,解决上传文件名乱码问题
servletFileUpload.setHeaderEncoding("utf-8");
try {
//解析上传的数据,得到每一个表单项FileItem
List<FileItem> list = servletFileUpload.parseRequest(request);
//判断每个表单项是普通类型还是上传的文件
for (FileItem item : list) {
if (item.isFormField()) {
//普通表单项
out.println("表单项的name:" + item.getFieldName());
//使用UTF-8解析,防止乱码
out.println("表单项的value:" + item.getString("UTF-8"));
} else {
//上传的文件
out.println("表单项的name:" + item.getFieldName());
out.println("上传的文件名为:" + item.getName());
//将此文件写到d盘根目录,如果FileItem对象中的主体内容是保存在某个临时文件中,该方法顺利完成后,临时文件有可能会被清除
item.write(new File("d:\\ceShi\\" + item.getName()));
//删除临时文件,尽管当FileItem对象被垃圾收集器收集时会自动清除临时文件,但及时调用delete方法可以更早的清除临时文件,释放系统存储资源。
item.delete();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
%>
返回结果: