前台页面要求
要实现文件上传,需要jsp页面的form表单满足这几个要求:
1、上传方式必须是:post,因为它可以携带大量数据
2、enctype 属性值必须是:multipart/form-data,即表单每一个提交项都独自成为一部分。
enctype 属性规定在发送到服务器之前应该如何对表单数据进行编码。
enctype属性描述:
值 描述 application/x-www-form-urlencoded 在发送前编码所有字符(默认) multipart/form-data 不对字符编码。
在使用包含文件上传控件的表单时,必须使用该值。
text/plain 空格转换为 "+" 加号,但不对特殊字符编码。
代码实现
前台jsp代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h2>上传文件</h2>
<form action="${pageContext.request.contextPath}/testFileUpload" method="post" enctype="multipart/form-data">
选择文件:<input type="file" name="filename"><br>
<input type="submit" value="上传"><br>
</form>
</body>
</html>
后台servlet代码
package com.cncs.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.ServletException;
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.util.List;
import java.util.UUID;
public class TestFileuploadServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) {
System.out.println("testFileUpload executing...");
//获取上传的路径
String path = request.getSession().getServletContext().getRealPath("/uploads");
File file = new File(path);
if (!file.exists()) {
//文件夹不存在,创建路径
file.mkdirs();
}
//创建磁盘文件项工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
//创建servlet文件上传对象
ServletFileUpload upload = new ServletFileUpload(factory);
//解析request对象
List<FileItem> fileItems = null;
try {
fileItems = upload.parseRequest(request);
} catch (FileUploadException e) {
e.printStackTrace();
}
//便利fileItems
for (FileItem fileItem : fileItems) {
if (fileItem.isFormField()) {
//普通项不做处理
} else {
//上传项
//获取上传的文件名称
String filename = fileItem.getName();
//通过UUID获取唯一标识码
String uuid = UUID.randomUUID().toString().replace("-", "");
filename = uuid + filename;
//写入上传的文件到本地
try {
fileItem.write(new File(file, filename));
} catch (Exception e) {
e.printStackTrace();
}
//删除临时文件
fileItem.delete();
}
}
System.out.println("文件上传成功!!!");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
配置web.xml
<?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_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>testFileuploadServlet</servlet-name>
<servlet-class>com.cncs.servlet.TestFileuploadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>testFileuploadServlet</servlet-name>
<url-pattern>/testFileupload</url-pattern>
</servlet-mapping>
</web-app>