下文笔者讲述Apache Commons FileUpload框架的功能简介说明,如下所示
Apache Commons FileUpload简介
Apache Commons是一个专注于可重用Java组件的所有方面的 Apache 项目。 Apache Commons项目由三个部分组成: Commons Proper - 可重用Java组件的存储库。 The Commons Sandbox - 用于Java组件开发的工作区。 The Commons Dormant - 当前不活动的组件存储库。 Commons-FileUpload是Commons Proper中的一个组件,该组件依赖于Commons-IO ,Commons-IO也是 Commons Proper中的一个组件。 Commons FileUpload的JAR包下载 Commons IO的JAR包下载
实现思路:
1.引入相应的jar包
2.使用类中的相应的方法即可
maven依赖
<!-- upload file -->
<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
前端界面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<% String path = request.getContextPath(); %>
<!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>upload</title>
</head>
<br>
<br>
<form action="<%=path%>/device/uploadFile" method ="post" enctype="multipart/form-data">
<input type ="file" name ="doc1"><br><br>
<input type ="file" name ="doc2"><br><br>
<input type ="text" name = info><br><br>
<input type ="password" name ="password"><br><br>
<input type="submit" value="提交">
</form>
<body>
</body>
</html>
后台代码
@RequestMapping(value="/uploadFile")
public String uploadFile(final HttpServletRequest request, final HttpServletResponse response){
request.setAttribute("msg", "Not first time!");
//创建一个“硬盘文件条目工厂”对象
DiskFileItemFactory factory = new DiskFileItemFactory();
//设置阈值,设置JVM一次能够处理的文件大小(默认吞吐量是10KB)
factory.setSizeThreshold(DiskFileItemFactory.DEFAULT_SIZE_THRESHOLD);
//设置临时文件的存储位置(文件大小大于吞吐量的话就必须设置这个值,比如文件大小:1GB ,一次吞吐量:1MB)
factory.setRepository(new File("d:\\test"));
//创建核心对象
ServletFileUpload fileUpload = new ServletFileUpload(factory);
//设置最大可支持的文件大小(10MB)
fileUpload.setFileSizeMax(1024*1024*10);
//设置转换时使用的字符集
fileUpload.setHeaderEncoding("UTF-8");
if(ServletFileUpload.isMultipartContent(request)){
try {
List<FileItem> fileItems = fileUpload.parseRequest(request);
for ( FileItem fileItem : fileItems) {
if(fileItem.isFormField()){//判断该FileItem为一个普通的form元素
//获取字段名
String fieldName = fileItem.getFieldName();
//获取字段值,并解决乱码
String fieldValue = fileItem.getString("UTF-8");
System.out.println(fieldName +" : " + fieldValue);
}else{//判断该FileItem为一个文件
System.out.println("Start to uplaod file!");
//获取文件名
String fileName = fileItem.getName();
System.out.println("fileName : " + fileName);
//获取文件大小
long fileSize = fileItem.getSize();
System.out.println("fileSize : " + fileSize);
fileItem.write(new File("D://test//upload"+File.separator +fileName));
}
}
} catch (FileUploadException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return "device/uploadFile";
}
异常处理
catch(FileUploadBase.SizeLimitExceededException ex){
out.print("上传失败,文件太大,单个文件的最大限制是:"+upload.getSizeMax()+"bytes!");
}
注意事项: 1.流的操作,和File类的操作,mkdirs()和mkdir()的区别: 都是用于创建文件夹的 mkdirs:能创建多级目录 mkdir:只能创建当前的文件夹 2.上传文件名的乱码问题, 如单表内容的乱码问题 如上传文件同名问题 如上传的文件很大 3.上传文件名乱码问题 使用servletFileUpload.setHeaderEncoding("UTF-8"); 或request.setCharacterEncoding("UTF-8")都可以 4.表单内容乱码问题 使用getString("utf-8") 5.避免同名问题: 使用UUID.randomUUID().toString().replace("-", "") 获得一个独一无二的32位数字 6.使用FileUtils.copyInputStreamToFile(is, file); 将内容输出到指定路径文件中去 mkdirs() 自动创建目录
生成多级目录的示例
public class StringUtils {
/**
* 生成二级目录
* @param fileName abc.txt
* @return /4/5
*/
public static String getDir(String fileName) {
//1 hashCode值
int hashCode = fileName.hashCode();
System.out.println(hashCode);
//2 第一层 0xf表示15的16进制数。
int dir1 = hashCode & 0xf;
//3 第二层目录
int dir2 = hashCode >>> 4 & 0xf;
//4 拼写
return "/" + dir1 + "/" + dir2;
}
public static void main(String[] args) {
System.out.println(getDir("abc.txt"));
}
}