文件上传(Servlet)
1、利用Maven自动导入jar包
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.3</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.5</version>
</dependency>
没有使用
Maven
的小伙伴只能自己手动导入了。
2、前端 jsp 编写
upload.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>upload</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/upload" method="post" enctype="multipart/form-data">
<input name="id" type="text">
<input name="file" type="file">
<input type="submit" value="提交">
</form>
</body>
</html>
注意:form
表单的enctype
一定要设为 multipart/form-data
multipart/form-data
表示提交的数据以多段(每一个表单项一个数据段)的形式进行拼接,然后以二进制流的形式发送给服务器。可以在网页的请求体查看(审查元素)这些数据。
3、编写 java 实现
uploadServlet类
@Override
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 创建一个工厂实现类
FileItemFactory factory = new DiskFileItemFactory();
// 创建一个用于实现解析上传数据文件的工具类
ServletFileUpload upload = new ServletFileUpload(factory);
try {
// 根据解析数据获取每一个表单项
List<FileItem> fileItems = upload.parseRequest(request);
for (FileItem item : fileItems) {
// 判断是每一个表单项
if (item.isFormField()) {
// 普通表单项
// 表单项的name
System.out.println("name = " + item.getFieldName());
// 表单项的value,并解决乱码问题
System.out.println("value = " + item.getString("UTF-8"));
} else {
// type为file的表单项
// 上传文件的文件名
String name = item.getName();
// 指定目录
File file = new File("E:\\file");
// 检查目录是否存在
if (!file.exists()) {
file.mkdir();
}
// 保存文件指定目录
item.write(new File(file + "\\" + name));
}
}
} catch (FileUploadException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
注意:上面用到的类是org.apache.commons.fileupload
下的不要选错包!
4、注册 Servlet
<servlet>
<servlet-name>upload</servlet-name>
<servlet-class>com.workhah.servlet.uploadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>upload</servlet-name>
<url-pattern>/upload</url-pattern>
</servlet-mapping>
用@WebServlet
注解注册serlvet
也可以
5、演示