Java中使用fileupload组件实现文件上传功能的实例代码
作者:msidolphin 发布时间:2021-11-17 09:20:33
使用fileupload组件的原因:
Request对象提供了一个getInputStream()方法,通过这个方法可以读取到客户端提交过来的数据,但是由于用户可能会同时上传多个文件,在servlet中编程解析这些上传数据是一件非常麻烦的工作。为方便开发人员处理文件上传数据,Apache开源组织提供了一个用来处理表单文件上传的一个开源组件(Commons-fileupload),该组件性能优异,并且使用及其简单,可以让开发人员轻松实现web文件上传功能。
使用Commons-fileupload组件实现文件上传,需要导入该组件相应的支撑jar包:
commons-fileupload和connons-io
(commons-upload组件从1.1版本开始,它的工作需要commons-io包的支持)
FileUpload组件工作流程:
相应的代码框架为:
package pers.msidolphin.uploadservlet.web;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.List;
import java.util.UUID;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
/**
* Servlet implementation class UploadServlet
*/
public class UploadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public UploadServlet() {
super();
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取解析工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
//得到解析器
ServletFileUpload parser = new ServletFileUpload(factory);
//解决文件名乱码问题
parser.setHeaderEncoding("UTF-8");
//判断上传表单类型
if(!ServletFileUpload.isMultipartContent(request)) {
return;
}
try {
//调用解析器解析上传数据
List<FileItem> fileItems = parser.parseRequest(request);
//获得保存上传文件目录的路径
String uploadPath = request.getServletContext().getRealPath("/WEB-INF/upload");
//遍历List集合
for (FileItem fileItem : fileItems) {
//判断是否为普通表单字段
if(fileItem.isFormField()) {
//如果是普通表单字段则打印到控制台
if(fileItem.getString() == null || "".equals(fileItem.getString().trim())) {
continue;
}
System.out.println(fileItem.getFieldName() + " = " + new String(fileItem.getString().getBytes("ISO-8859-1"), "UTF-8"));
}else {
//获得文件路径
String filePath = fileItem.getName();
//如果并未上传文件,继续处理下一个字段
if(filePath == null || "".equals(filePath.trim())) {
continue;
}
System.out.println("处理文件:" + filePath);
//截取文件名
String fileName = filePath.substring(filePath.lastIndexOf("\\") + 1);
String reallyName = this.createFileName(fileName);
String reallyPath = this.mkDir(reallyName, uploadPath);
//下面都是普通的IO操作了
InputStream in = fileItem.getInputStream();
FileOutputStream out = new FileOutputStream(reallyPath + "\\" + reallyName);
byte[] buffer = new byte[1024];
int len = 0;
while((len = in.read(buffer)) > 0) {
out.write(buffer, 0, len);
}
out.close();
in.close();
}
}
System.out.println("处理完毕...");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
//随机产生唯一的文件名
private String createFileName(String fileName) throws NoSuchAlgorithmException, UnsupportedEncodingException {
String extension = fileName.substring(fileName.lastIndexOf("."));
MessageDigest md = MessageDigest.getInstance("md5");
String currentTime = System.currentTimeMillis() + "";
return UUID.randomUUID() + currentTime + extension;
}
//根据哈希值产生目录
private String mkDir(String fileName, String uploadPath) {
int hasCode = fileName.hashCode();
//低四位作为一级目录
int parentDir = hasCode & 0xf;
//二级目录
int childDir = hasCode & 0xff >> 2;
File file = new File(uploadPath + "\\" + parentDir + "\\" + childDir);
if(!file.exists()) {
file.mkdirs();
}
uploadPath = uploadPath + "\\" + parentDir + "\\" + childDir;
return uploadPath;
}
}
JSP页面 :
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<fmt:setBundle basename="pers.msidolphin.uploadservlet.lang.locale" var="bundle" scope="page"/>
<form action="<c:url value="/UploadServlet"/>" method="post" enctype="multipart/form-data">
<fmt:message key="username" bundle="${bundle}"/><input type="text" name="username"/>
<br/>
<br/>
<fmt:message key="file1" bundle="${bundle}"/><input type="file" name="file1"/>
<br/>
<br/>
<fmt:message key="file2" bundle="${bundle}"/><input type="file" name="file2"/>
<br/>
<br/>
<input type="submit" value="<fmt:message key="submit" bundle="${bundle}"/>"/>
</form>
</body>
</html>
核心API: DiskFileItemFactory类
//设置内存缓冲区的大小,默认为10K,当上传文件大小大于缓冲区大小,fileupload组件将使用临时文件缓存上传文件
public void setSizeThreshold(int sizeThreshold);
//指定临时文件目录 默认值为System.getProperty("java.io.tmpdir")
public void setRepository(java.io.file respository);
//构造方法
public DiskFileItemFactory(int sizeThreshold, java.io.file respository);
核心API: ServletFileUpload类
//判断上传表单是否为multipart/form-data类型
boolean isMultipartContent(HttpServletRequest request);
//解析request对象,并把表单中的每一个输入项包装成一个fileitem对象,返回这些对象的list集合
List<FileItem> parseRequest(HttpServletRequest request);
//设置上传文件总量的最大值 单位:字节
void setSizeMax(long sizeMax);
//设置单个上传文件的最大值 单位:字节
void setFileSizeMax(long fileSizeMax);
//设置编码格式,用于解决上传文件名的乱码问题
void setHeaderEncoding(String encoding);
//设置文件上传 * ,作用是实时获取已上传文件的大小
void setProgressListener(ProgressListener pListener);
核心API: FileItem类
//判断表单输入项是否为普通输入项(非文件输入项,如果是普通输入项返回true
boolean isFormField();
//获取输入项名称
String getFieldName();
//获得输入项的值
String getString();
String getString(String encoding); //可以设置编码,用于解决数据乱码问题
以下是针对非普通字段的:
//获取完整文件名(不同的浏览器可能会有所不同,有的可能包含路径,有的可能只有文件名)
String getName();
//获取文件输入流
InputStream getInputStream();
文件上传的几个注意点:
1、上传文件的文件名乱码问题:ServletFileUpload对象提供了setHeaderEncoding(String encoding)方法可以解决中文乱码问题
2、上传数据的中文乱码问题:
解决方法一:new String(fileItem.getString().getBytes(“ISO-8859-1”), “UTF-8”)
解决方法二:fileItem.getString(“UTF-8”)
解决方法三:fileItem.getString(request.getCharacterEncoding())
3、上传文件名的唯一性:UUID、MD5解决方法很多…
4、保存上传文件的目录最好不要对外公开
5、限制上传文件的大小: ServletFileUpload对象提供了setFileSizeMax(long fileSizeMax)和setSizeMax(long sizeMax)方法用于解决这个问题
6、限制文件上传类型:截取后缀名进行判断(好像不太严格,还要研究一番…)
以上所述是小编给大家介绍的Java中使用fileupload组件实现文件上传功能的实例代码网站的支持!
来源:http://blog.csdn.net/mass_effect/article/details/72522857


猜你喜欢
- SpringBoot获取所有接口的路由@Autowired WebApplicationContext appli
- 在Excel中,可对单元格中的字符串设置多种不同样式,通常只需要获取到单元格直接设置样式即可,该方法设置的样式会应用于该单元格中的所有字符。
- 1.关系运算符!= 与等号共同组成关系运算符,检查两个操作数的值是否相等,如:A!=B2.逻辑运算符! 称为逻辑非运算符。用来逆转操作数的逻
- JAVA反射机制JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方
- Android 中ScrollView嵌套GridView,ListView的实例在Android开发中,经常有一些UI需要进行固定styl
- Activator.CreateInstance和AssemblyCreateInstance性能测试using System;using
- ActivityThread功能它管理应用进程的主线程的执行(相当于普通Java程序的main入口函数),并根据AMS的要求(通过IAppl
- 这篇文章是android开发人员的必备知识,是我特别为大家整理和总结的,不求完美,但是有用。1.背景自适应且不失真问题的存在制作自适应背景图
- 本文实例讲述了spring AOP定义AfterThrowing增加处理。分享给大家供大家参考,具体如下:一 配置<?xml vers
- spring boot 作为微服务的便捷框架,在错误页面处理上也有一些新的处理,不同于之前的spring mvc 500的页面处理是比较简单
- 题目要求思路一:枚举 + 二分逐一枚举值域内的所有值,然后二分判断是否合法。Javaclass Solution { &nbs
- 当我们使用Jmeter工具进行接口测试,可利用CSV Data Set Config配置元件,对测试数据进行参数化,循环读取csv文档中每一
- 实践过程效果代码public partial class Form1 : Form{ public Form1()
- 前言在上一篇普通的加载千篇一律,有趣的 loading 万里挑一 中,我们介绍了使用Path类的PathMetrics属性来控制绘制点在路径
- 今天从网上找了个例子实现了语音识别,个人感觉挺好玩的,就把代码贴出来与大家分享下: &nbs
- 实践过程效果代码public partial class Form1 : Form {
- MyBatis缓存我们知道,频繁的数据库操作是非常耗费性能的(主要是因为对于DB而言,数据是持久化在磁盘中的,因此查询操作需要通过IO,IO
- 问题描述:eclipse启动tomcat时,不能加载web项目,但是把war包丢进tomcat的webapps下是能正常运行的解决方式:右键
- 一、ArrayList 了解过吗?它是啥?有啥用?众所周知,Java 集合框架拥有两大接口 Collection 和 Map,其中,Coll
- 在 Android 中,多数情况下每个程序都是在各自独立的 Linux 进程中运行的。当一个程序或其某些部分被请求时,它的进程就“出生”了;