基于FlieUpload组件的文件上传
直接上代码
现在导入FileUpload组件的jar包 下载
- jsp页面编写
注意点:
(1)提交方式必须为post、
(2)enctype的属性必须为multipart/form-data
<form action="${pageContext.request.contextPath}/FileController" method="Post" enctype="multipart/form-data">
<input type="file" name="files"/>
<input type="submit" value="提交"/>
</form>
2.servlet处理类
@WebServlet("/FileController")
public class FileController extends HttpServlet {
private static final long serialVersionUID = 1L;
public FileController() {
// TODO Auto-generated constructor stub
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doPost(request, response);
}
/** 处理上传文件 */
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
// 设置编码格式
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
response.setCharacterEncoding("UTF-8");
// 先判断单位文件是否符合文件上传
boolean isUpload = ServletFileUpload.isMultipartContent(request);
if(!isUpload) {
throw new RuntimeException("当前文件不适合上传");
}
// (1)创建DiskFileItemFactory工厂对象
DiskFileItemFactory factory = new DiskFileItemFactory();
// 临时文件夹
// (拓展:如果总是每次请求都写入到硬盘中有不必要的资源浪费,这里可以设置一下给定一个“临时目录”,到达一定的值的时候再一次写入硬盘中)
factory.setSizeThreshold(1024 * 1024 * 5);// 文件到达5M的时候使用临时文件夹
String realPath2 = this.getServletContext().getRealPath("/tempUpload");// 临时文件夹
factory.setRepository(new File(realPath2));
// (2)创建核心上传组件
ServletFileUpload sfUpload = new ServletFileUpload(factory);
// 设置上传文件大小
// (扩展:可以设置文件上传的大小)
sfUpload.setFileSizeMax(1024 * 1024 * 3);// 单个文件最大值
sfUpload.setSizeMax(1024 * 1024 * 10);// 整个最大值
// 因为传递过来的不单单只是一个file请求对象。
// 所以,对请求的数据进行判断。
try {
List<FileItem> parseRequest = sfUpload.parseRequest(request);// 获取所有请求数据
for (FileItem fileItem : parseRequest) {
// 判断是否是文件
if(fileItem.isFormField()) {
// 为普通请求参数
String fieldName = fileItem.getFieldName();// 请求字段名称
String value = fileItem.getString("utf-8");// 请求字段值
System.out.println(fieldName+"、"+value);
}else {// 上传文件
String name = fileItem.getName();// 获取文件名
// 文件重名 使用 uuid
// (扩展:如果是很多用户提交了文件,可是用户可能会提交的名称是相同的。这样会造成,资源覆盖等问题)
name = name.substring(name.lastIndexOf("\\") + 1); // 字符串截取再拼接
name = UUID.randomUUID() + "_" + name;
InputStream inputStream = fileItem.getInputStream();// 获取输入流
String realPath = this.getServletContext().getRealPath("/upload");// 设置保存路径
// 多级目录的设置
// (扩展:如果总是向一个文件夹里面写内容。总有一天资源会超过这个文件夹的最大容量,所有需要设置多级目录)
LocalDate now = LocalDate.now();
int year = now.getYear();
int month = now.getMonthValue();
int day = now.getDayOfMonth();
// 使用upload下创建年月日三级子目录
realPath = realPath + "/" + year + "/" + month + "/" + day;
// 创建父目录
File file2 = new File(realPath);
// 如果父目录不存在,就创建子目录
if(!file2.exists()) {
file2.mkdirs();
}
File file = new File(realPath,name);// 创建文件对象
FileOutputStream fileOutputStream = new FileOutputStream(file);// 写入realPath路径中
// 转为底层字节形式存入
byte[] by = new byte[1024];
int length = -1;
while ((length = inputStream.read(by)) != -1) {
fileOutputStream.write(by, 0 , length);
}
// 关闭流
inputStream.close();
fileOutputStream.close();
fileItem.delete();
}
}
} catch (FileUploadException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}