<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/upload1" enctype="multipart/form-data" method="post">
<input type="text" name="username"><br>
<input type="password" name="password"><br>
<input type="file" name="image"><br>
<input type="submit">
</form>
</body>
</html>
问题的话,主要有两大类,
- 文件会有分隔符,导致文件损坏
- 获取请求参数的API不再适用,无法获取到普通form表单数据
原因都是因为添加了enctype=multipart/form-data,因为添加这个属性,使得请求体的数据结构发生了变更,所以获取请求参数的API不在适用,同时添加之后,会多出很多分隔符,所以文件中会包含有分隔符。
使用组件来进行文件上传
接下来的内容大家会觉得代码太多,而且不理解,记不住。不用去深究。
Spring。Spring会帮助你把这些步骤全部封装好,所以今后啥也不用干。
Commons-FileUpload组件
@WebServlet("/upload1")
public class UploadServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
//post里面写代码
boolean result = ServletFileUpload.isMultipartContent(request);
if(!result){
response.getWriter().println("不包含上传的文件");
return;
}
//result=true
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletContext servletContext = getServletContext();
File repository = (File) servletContext.getAttribute("javax.servlet.context.tempdir");
factory.setRepository(repository);
// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);
//如果上传的文件名中文乱码,可以这么解决
//upload.setHeaderEncoding("utf-8");
// bytes 1024 bytes
//upload.setFileSizeMax(1024);
try {
List<FileItem> items = upload.parseRequest(request);
//对items进行迭代
Iterator<FileItem> iterator = items.iterator();
while (iterator.hasNext()){
//每一个item其实就是一个input框的封装
FileItem item = iterator.next();
if(item.isFormField()){
//当前是普通的form表单数据
processFormField(item);
}else{
//当前是上传的文件
processUploadedFile(item);
}
}
} catch (FileUploadException e) {
e.printStackTrace();
}
}
/**
* 处理上传的文件逻辑
* @param item
*/
private void processUploadedFile(FileItem item) {
String fieldName = item.getFieldName();
String fileName = item.getName();
System.out.println(fieldName + " === " + fileName);
String realPath = getServletContext().getRealPath("upload/" + fileName);
File file = new File(realPath);
if(!file.getParentFile().exists()){
file.getParentFile().mkdirs();
}
try {
//保存文件到硬盘中
item.write(file);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 处理普通的form表单数据
* 只需要获取name和value值即可
* 上传文件之后,不要再用getParameter去获取请求参数了
* 有没有中文乱码问题呢?
* @param item
*/
private void processFormField(FileItem item) {
String name = item.getFieldName();
String value = null;
try {
value = item.getString("utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
System.out.println(name + " = " + value);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}