文件上传
1. 所需三方工具
1.1. commons-fileupload-1.2.2.jar 文件上传需要的工具
1.2. commons-io-2.0.1.jar 文件上传所需要的工具
1.3. commons-lang-2.5.jar 使用其字符串工具,如:判断某字符串是否是空的
2. 自定义的工具
2.1. UploadUtils.java
2.2. 因为本工具需要使用临时目录,所以然在web根目录下建立temp文件夹
package com.jeremy.util;
import java.io.File;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadBase.FileSizeLimitExceededException;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.StringUtils;
public class UploadUtils {
private Map<String, String> textFields = new HashMap<String, String>(); // 普通元素
private Map<String, FileItem> fileFields = new HashMap<String, FileItem>(); // 文件上传元素
private String baseFolder; // 项目根目录
private String customFolder; // 上传目录的下级目录
private String uploadFolder; // 上传根目录
private String tempFoleer; // temp folder
private String[] allowFileExtName; // 允许上传的文件类型
/**
* 处理上传
*
* @param request
* @param uploadPath 用户选择上传的目录
*/
public void upload(HttpServletRequest request, String uploadPath) {
// 初始化 根目录,上传目录,用户自定义的上传子目录,临时目录和允许上传的文件类型
baseFolder = request.getSession().getServletContext().getRealPath("/");
customFolder = File.separator + uploadPath;
uploadFolder = baseFolder + customFolder;
tempFoleer = request.getSession().getServletContext().getRealPath("/temp");
allowFileExtName = request.getSession().getServletContext().getInitParameter("allowFileExtName").split(",");
// Check that we have a file upload request
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
try {
if (isMultipart) {
// Create a factory for disk-based file items
DiskFileItemFactory factory = new DiskFileItemFactory();
// Set factory constraints
factory.setSizeThreshold(1024 * 1024 * 10); // 表单上传占用最大内存为10M
factory.setRepository(new File(tempFoleer)); // 临时文件
// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);
// Single file size 20M
upload.setFileSizeMax(1024 * 1024 * 20);
// Parse the request
List<FileItem> /* FileItem */items = upload.parseRequest(request);
for (FileItem fileItem : items) {
// 文件名
String fileName = fileItem.getName();
// 如果是普通表单元素,将元素放进textFields中
if (fileItem.isFormField()) {
textFields.put(fileItem.getFieldName(), fileItem.getString());
} else if (StringUtils.isNotBlank(fileName) && ArrayUtils.contains(allowFileExtName, fileName.substring(fileName.lastIndexOf(".")))) {
// 如果有上传元素,且是允许上传的文件,则将FileItem直接放入fileFields中
fileFields.put(fileItem.getFieldName(), fileItem);
}
}
} else {
return;
}
} catch (FileSizeLimitExceededException e) {
System.out.println("单个文件超出大小限制");
} catch (FileUploadException e) {
e.printStackTrace();
}
}
/**
* 如果在普通元素的Map中找到对应的值就返回当前值
* 在普通元素的Map中没有找到对应的值,就去上传元素的Map中找
* @param name
* @return 如果都没有找到,返回的是空
*/
public String getParameter(String name) {
if (getTextParameter(name) != null) {
return getTextParameter(name);
} else {
return getFileParameter(name);
}
}
public Map<String, Object> getParameterMap() {
Map<String, Object> map = new HashMap<String, Object>();
map.putAll(textFields); // 将普通元素Map全部复制到新定义的Map中
// 便利fileFields的Map
Iterator<String> keys = fileFields.keySet().iterator();
while (keys.hasNext()) {
String key = keys.next();
// 将上传后返回的路径追加到新定义的Map中
map.put(key, getFileParameter(key));
}
return map;
}
/**
* 获取普通元素
* @param name
* @return
*/
private String getTextParameter(String name) {
return textFields.get(name);
}
/**
* 获取文件上传后的路径
*
* @param name
* @return
*/
private String getFileParameter(String name) {
FileItem fileItem = fileFields.get(name); // 上传项
if (fileItem != null) {
String fileName = fileItem.getName(); // 客户端的文件名
String fileExtName = fileName.substring(fileName.lastIndexOf(".")); // 文件扩展名
// 放在服务器上的上传目录中的文件名
String fileNameAtUploaded = fileName.substring(0, fileName.lastIndexOf(".")) + "_" + UUID.randomUUID() + fileExtName;
// 写入上传目录
try {
fileItem.write(new File(uploadFolder, fileNameAtUploaded));
} catch (Exception e) {
e.printStackTrace();
}
// 返回文件上传路径
return customFolder + File.separator + fileNameAtUploaded;
}
return null;
}
}3. 上传的jsp页面 3.1. index.jsp<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!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>
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="hidden" name="id" value="1"><br/>
用户名:<input type="text" name="name"/><br/>
附件:<input type="file" name="file"/><br/>
附件2:<input type="file" name="file2"/><br/>
<input type="submit" value="提交"/>
</form>
</body>
</html> 4. 管理上传的Servlet 4.1. UploadServlet package com.jeremy.servlet;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.beanutils.BeanUtils;
import com.jeremy.domain.User;
import com.jeremy.util.UploadUtils;
/**
* Servlet implementation class UploadServlet
*/
public class UploadServlet extends HttpServlet {
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 上传工具类
UploadUtils uploadUtils = new UploadUtils();
uploadUtils.upload(request, "upload"); // 执行上传处理,upload是上传的位置
User user = new User();
try {
BeanUtils.copyProperties(user, uploadUtils.getParameterMap());
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
System.out.println(user);
}
}5. 建立业务对象 5.1 User.javapackage com.jeremy.domain;
public class User {
private Integer id;
private String name;
private String file;
private String file2;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getFile() {
return file;
}
public void setFile(String file) {
this.file = file;
}
public String getFile2() {
return file2;
}
public void setFile2(String file2) {
this.file2 = file2;
}
@Override
public String toString() {
return "User [id = " + id + ", name = " + name + ", file = " + file + ", file2 = " + file2 + "]";
}
}

浙公网安备 33010602011771号