上传图片
图片提交成功后需要在当前项目中的 out目录下才能找到提交的图片哦~~~
index.jsp有点low,但是可以满足基本需求,各位有什么好点子的话可以自行尝试的哦
本代码中有一个Bug,文件如果超过限制的大小了,异常则无法捕获,这个是Tomcat的问题,解决方案是在Tomcat目录中的找到conf文件夹,修改server.xml中的配置
修改前:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
修改后:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000" connectionUploadTimeout="36000000" disableUploadTimeout="false" maxSwallowSize="-1"
redirectPort="8443" />
针对上传图片的Servlet
package com.alibaba.fileload;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadBase;
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.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.UUID;
@WebServlet("/UploadFileServlet")
public class UploadFileServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*
用户文件上传位置的问题,其他用户不能直接通过 URL 获取到对应的文件,所以该文件保存在 WEB-INF下,在 WEB-INF下,创建一个 upload 目录
*/
String savePath = this.getServletContext().getRealPath("/WEB-INF/upload");
File file = new File(savePath);
/*
临时文件夹
*/
String tempPath = this.getServletContext().getRealPath("/WEB-INF/temp");
File temp = new File(tempPath);
// 判断对应目录是否存在
if (!file.exists() || !file.isDirectory()) {
// 创建对应目录
file.mkdir();
}
if (!temp.exists() || !temp.isDirectory()) {
temp.mkdir();
}
// 保存在操作中的异常和提示信息
String msg = "";
try {
// 1、创建 DiskFileItemFactory 工厂对象
DiskFileItemFactory factory = new DiskFileItemFactory();
// 设置传入的最大文件字节数
factory.setSizeThreshold(1024 * 1024 * 10);
// 设置当前文件的保存临时目录
factory.setRepository(temp);
// 2、创建一个上传文件的解析器
ServletFileUpload upload = new ServletFileUpload(factory);
// 3、确定修改上传文件对应的解析器字符集为 utf-8
upload.setHeaderEncoding("utf-8");
// 设置解析器的最大文件大小
upload.setSizeMax(1024 * 1024 * 10);
// 设置解析器能够处理的单个最大文件大小
upload.setFileSizeMax(1024 * 1024 * 5);
// 4、判断在提交数据的 form 表单中,是否包含 enctype="multipart/form-data"
if (!ServletFileUpload.isMultipartContent(request)) {
return;
}
/*
5、解析 REQUEST请求内容
解析之后的返回值是 List<FileItem> 保存的内容都是对应的 文件元素
*/
List<FileItem> fileItems = upload.parseRequest(request);
for (FileItem fileItem : fileItems) {
/*
解析 request 请求中,存在非文件上传请求
判断提交的数据是普通参数,非文件上传
*/
if (!fileItem.isFormField()) {
// 处理文件 获取文件的名字
String name = fileItem.getName();
String fileEName = name.substring(name.lastIndexOf(".") + 1);
// 判断当前获取到的文件后缀名是否符合系统要求
if (!"jpg|jpeg|png|gif|bmp".contains(fileEName.toLowerCase())) {
continue;
}
// 获取UUID文件名和对应日期的保存文件夹名
String fileName = makeFileName(name);
String fileSavePath = makeDirName(savePath);
File dir = new File(fileSavePath);
if (!dir.exists() || !dir.isDirectory()) {
dir.mkdir();
}
/*
操作 IO 流,读取文件和写入文件
通过 FileItem 获取上传文件的输入字节流
*/
BufferedInputStream bis = new BufferedInputStream(fileItem.getInputStream());
// 服务器读取到从浏览器提交的数据之后,保存数据到硬盘中,这里需要一个输出流
BufferedOutputStream bos = new BufferedOutputStream(
new FileOutputStream(fileSavePath + File.separatorChar + fileName));
// 创建一个缓冲字节数组 4KB
byte[] buffer = new byte[1024 * 4];
int length = -1;
// 从浏览器读取数据,通过缓冲流写入数据到服务器指定目录中
while ((length = bis.read(buffer)) != -1) {
bos.write(buffer, 0, length);
}
// 关闭缓冲流资源
bos.close();
bis.close();
// fileItem 是一个资源,需要delete
fileItem.delete();
msg = "文件上传成功";
}
}
/*
文件如果超过设定的大小,或者需要抛出其他异常,需要在tomcat修改配置文件server.xml
修改前:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
修改后:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000" connectionUploadTimeout="36000000" disableUploadTimeout="false" maxSwallowSize="-1"
redirectPort="8443" />
*/
} catch (FileUploadBase.SizeLimitExceededException e) {
msg = "文件总大小超出限制异常";
e.printStackTrace();
request.setAttribute("msg", msg);
// 转发到 msg.jsp
request.getRequestDispatcher("msg.jsp").forward(request, response);
return;
} catch (FileUploadException e) {
msg = "文件上传失败";
e.printStackTrace();
request.setAttribute("msg", msg);
// 转发到 msg.jsp
request.getRequestDispatcher("msg.jsp").forward(request, response);
return;
}
request.setAttribute("msg", msg);
request.getRequestDispatcher("msg.jsp").forward(request, response);
}
/**
* 使用 UUID 重新编写文件的名字
* @param fileName 传入的文件名
* @return 重新编译通过 UUID 整理之后的文件名
*/
private String makeFileName(String fileName) {
fileName = UUID.randomUUID().toString() + "_" + fileName.substring(fileName.lastIndexOf("."));
return fileName.replaceAll("-", "");
}
/**
* 根据传入的保存文件夹的根目录,获取对应当前日期的文件夹完整的路径,用于创建
* @param savePath 保存文件夹的根目录
* @return 当前日期保存文件的 String 类型绝对路径
*/
private String makeDirName (String savePath) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd");
String date = simpleDateFormat.format(new Date());
return savePath + File.separatorChar + date;
}
}
上传图片对应的 index.jsp
<%--
Created by IntelliJ IDEA.
Date: 2019/7/2
Time: 9:45
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="UploadFileServlet" method="post" enctype="multipart/form-data">
Name: <input type="text" name="username" placeholder="请输入姓名" /> <br>
FileOne: <input type="file" name="file1" /> <br>
FileTwo: <input type="file" name="file2" /> <br>
<input type="submit" value="提交"/>
</form>
</body>
</html>