在JSP中上传多个文件,控制上传文件类型、大小以及重命名文件的详细步骤代码
下面网址Apache官方网站的资源下载,本次我们需要用到一下三个架包
Commons Pool
http://commons.apache.org/proper/commons-pool/download_pool.cgi
Commons IO
http://commons.apache.org/proper/commons-io/download_io.cgi
FileUpload
http://commons.apache.org/proper/commons-fileupload/download_fileupload.cgi
可以根据自己电脑当前的环境配置选择下载合适的架包版本,有些版本不兼容以前的JDK
注意我们下载的是Binaries的压缩包
解压后可以得到一下文件
我们选择上面三个架包按下Ctrl+C,再将架包粘贴到我们JSP项目的WEB-IN/lib下面
下面代码都已经经过实际测试,运行环境Tomcat9.0,编译环境JDK12,编写环境IntelliJ IDEA 2019.1.3 x64,浏览器为360极速浏览器
在项目下面建立一个用于提交选择文件的页面 index.jsp
<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<head>
<title>文件上传</title>
</head>
<body>
<form action="do_upload.jsp" enctype="multipart/form-data" method="post">
用户名:<input name="username" type="text"><br>
<%-- multiple 用于一次提交多个文件,不加那么就是只能选择一个文件--%>
<input type="file" name="image" multiple="multiple">
<input type="submit" value="提交">
</form>
</body>
</html>
然后在建立一个 do_upload.jsp 文件,改文件用来处理用户提交的文件
<%@ page import="java.util.List" %>
<%@ page import="java.io.File" %>
<%@ page import="org.apache.commons.fileupload.FileItemFactory" %>
<%@ page import="org.apache.commons.fileupload.disk.DiskFileItemFactory" %>
<%@ page import="org.apache.commons.fileupload.servlet.ServletFileUpload" %>
<%@ page import="org.apache.commons.fileupload.FileItem" %>
<%@ page import="org.apache.commons.fileupload.FileUploadException" %>
<%@ page import="java.util.Arrays" %>
<%@ page import="com.mokerson.util.DateOut" %>
<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%>
<%
request.setCharacterEncoding("utf-8");
// 创建FileItemFactory工厂,用于创建ServletFileUpload对象;
FileItemFactory factory = new DiskFileItemFactory();
//创建ServletFileUpload对象,文件操作对象
//实现文件上传操作
ServletFileUpload sfu = new ServletFileUpload(factory);
// 控制文件上传的大小,请注意文件大小的单位是以b计算的
// 1024b=1kB
// 1024KB=1MB
// 5*1024*1024的大小为5MB
sfu.setSizeMax(5*1024*1024);
try{
//判断表单的enctype是multipart/form-dat,判断请求信息中的内容是否为multipart类型
if(ServletFileUpload.isMultipartContent(request)) {
try {
//获取表单form中所有的字段
List<FileItem> itemList = sfu.parseRequest(request);
// 遍历所有的字段
for (FileItem item : itemList) {
// 判断是否为普通表单字段,还是文件上传字段
if (item.isFormField()) {
// 获取普通表单字段的name值
String name = item.getFieldName();
if ("username".equals(name)) {
//普通字段的name值为user
//获取该表单中(input框)中的值
String value = item.getString("UTF-8");
out.print(value + "上传了文件");
}
} else {
//不是普通的字段,那么就是文件字段
// 上传多个文件的时候,自然而然就会进入这里提交文件
//获取上传的文件名字
String fileName = item.getName();
//设置图片的类型,文件上传的类型
List<String> fileType = Arrays.asList("gif", "bmp", "jpg");
//获得文件后缀名,为什么从后面开始找,因为防止有些用户使用“.”作为文件名
// 但是最后面的点一定是文件的真实类型
String ext = fileName.substring(fileName.lastIndexOf(".") + 1);
// 判断ext是否属于fileType里面的一个类型
if (!fileType.contains(ext)) {
out.print("上传失败,请检查文件类型");
} else {
//使用application的getRealPath()方法来获取相对路径的绝对位置
// 注意相对路径的文件或者文件夹位置一定是要存在的,不然就会报错
String path = application.getRealPath("/web/img");
// 输出相对路径的绝对路径
out.print("相对路径/web/img的绝对路径为:" + path);
// 控制文件上传的文件名
// 当前时间+五位随机数+文件后缀名
// DateOut.getNowTimeRegulationFileName()是我自己编写的方法,
// 用于返回当前时间的字符串里面不包含“:”
fileName = DateOut.getNowTimeRegulationFileName()+"_" +(((int)(Math.random() * 90000))+10000)+"."+ext;
// 写入文件就需要文件对象
// 让file指向这个文件
File file = new File(path + "/" + fileName);
// 将文件写入到文件夹中
try {
// 防止文件不存在,导致异常
item.write(file);
} catch (Exception e) {
e.printStackTrace();
}
out.print("<br>文件上传成功");
out.print("<br><img src='web/img/" + fileName + "' alt='img'");
}
}
}
} catch (FileUploadException e) {
e.printStackTrace();
}
}
}catch(Exception ignored){
out.print("建议上传"+sfu.getSizeMax()+"一下的文件");
}
%>
运行后得到一下的结果
在这里插入图片描述
提交后
提交多个文件
查看提交的文件只要复制那个绝对路径E:\07 JavaServerPages\Project\IntelliJ IDEA\Learn_Chapter06\out\artifacts\Learn_Chapter06_war_exploded\web\img ,然后粘贴到资源管理器的地址栏按回车键后就能的到一下内容,可以看到文件都被重新命名了
上传超过设置的文件大小文件后
这是因为Tomcat 9.0 版本不支持FileUploadBase.SizeLimitExceededException这个异常了,建议使用Tomca7.0.34这个版本尝试。只要把Exception e 换成FileUploadBase.SizeLimitExceededException e 就可以了,但是这个异常还要导包,属于自定义异常
好了以上就是上传文件的详细步骤,如果喜欢那么就支持一下我吧!