由于我老婆这边需要用到文件上传,然后这任务不知道怎么就到了我头上。她的框架是比较老的struts2(说实话我一度连struts2都拼写不对。。。)
背景介绍
从毕业以来最早接触的是SpringMVC,到后面用的是SpringBoot,struts2只出现在我大学课程里面毕竟这么重的框架又都是漏洞早就已经被踢出历史洪流。
让我去回顾struts2是不可能的,接到的任务又只是完成文件上传,那么我用Servlet搞定就好了,高效便捷。
代码
引入依赖
她的项目使用到的技术栈是struts2+tomcat,没有使用maven管理依赖,所以我们也利用原始的方式,去网上下载jar包引入。
印象里面她的项目中关于上传引用的jar包是commons-fileupload-1.3.jar
,commons-io-1.2.jar
,所以即使有新的jar我也用了这两个比较老的jar,附上下载地址:
https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload/1.3
https://mvnrepository.com/artifact/commons-io/commons-io/1.2
下载完成后放入lib目录(好怀念):
其实从eclipse转而使用idea以来很久没有用过jar包导入依赖的形式了,所以这里还是百度了一下,这里需要这样配置:
点击+,添加导入tomcat的依赖
和刚才两个jarcommons-fileupload-1.3.jar
,commons-io-1.2.jar
的依赖。
tomcat依赖配置
jar包依赖
代码编写
大致梳理一下,我们需要编写至少1个java文件
和1个jsp文件
。
为了有明显的效果,这里编写2个jsp文件
,一个用来提供上传选择的界面,一个用来显示上传之后的结果。
UploadServlet
新建一个java文件:
源码如下:
package com.upload.service;
import org.apache.commons.fileupload.FileItem;
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.Iterator;
import java.util.List;
public class UploadServlet extends HttpServlet {
// 文件路径定义
public static final String filePath = "/Users/younglu/upload";
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException {
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html; charset=UTF-8");
// 判断提交类型是否为multipart/form-data
boolean isMultipart = ServletFileUpload.isMultipartContent(req);
if (isMultipart) {
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload servletFileUpload = new ServletFileUpload(factory);
// 前端传过来的三个参数 工号、姓名和文件名
String sno = null;
String sname = null;
String filename = null;
try {
List<FileItem> items = servletFileUpload.parseRequest(req);
Iterator<FileItem> it = items.iterator();
// 迭代从前端获取的数据,处理表单数据和文件数据
while (it.hasNext()) {
FileItem item = it.next();
if (item.isFormField()) {
if (item.getFieldName().equals("sno")) {
sno = item.getString("utf-8");
} else if (item.getFieldName().equals("sname")) {
sname = item.getString("utf-8");
} else {
System.out.println("其他字段,忽略。");
}
} else {
filename = item.getName();
// 文件夹不存在则创建
File dir = new File(filePath);
if (!dir.exists()) {
dir.mkdir();
} else if (dir.exists() && dir.isDirectory()){
System.out.println("文件夹存在,跳过新建文件夹流程!");
} else {
throw new Exception("无法创建文件夹,请确认目标路径是一个文件夹类型!");
}
File file = new File(filePath, filename);
item.write(file);
req.setAttribute("news", String.format("%s-%s : %s已上传成功,谢谢分享", sno, sname, filename));
}
}
} catch (Exception e) {
req.setAttribute("news", String.format("%s-%s : %s上传失败,请查看错误日志!", sno, sname, filename));
System.out.println(String.format("文件上传失败,错误原因为:%s",e.getMessage()));
}
req.getRequestDispatcher("print.jsp").forward(req, resp);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
}
配置servlet到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>uploadServlet</servlet-name>
<servlet-class>com.upload.service.UploadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>uploadServlet</servlet-name>
<url-pattern>/upload</url-pattern>
</servlet-mapping>
</web-app>
当请求到/upload时,将会根据http的类型调到上面的UploadServlet的doGet或者doPost方法(其实代码逻辑相同)。
index.jsp
<%--
Created by IntelliJ IDEA.
User: younglu
Date: 2021/6/22
Time: 9:16 上午
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>文件上传</title>
</head>
<body>
<form action="upload" method="post" enctype="multipart/form-data">
<div>
<h1>文件上传功能</h1>
</div>
<div>
工号:<input name="sno">
</div>
<div>
姓名:<input name="sname">
</div>
<div>
上传文件:<input type="file" name="spicture">
</div>
<div>
<input type="submit" value="上传">
</div>
</form>
</body>
</html>
print.jsp
<%--
Created by IntelliJ IDEA.
User: younglu
Date: 2021/6/22
Time: 9:16 上午
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>文件上传结果</title>
</head>
<body>
${msg}
</body>
</html>