- Servlet3.0对文件上传的支持
- commons-fileupload.jar
- smartupload.jar
- struts2实现文件上传
下面贴上实现的几种方式,陆续完善,所有方式公用一个文件上传表单文件upload.jsp
Servlet3.0实现文件上传
当需要普通表单域数据时可以通过req.getParameter("XXX")来获得,到时只能接收英文和数字,中文字符并不能解析,字符编码转码并不能用!
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
My JSP 'upload.jsp' starting page
package com.bookstore.action;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import javax.annotation.Resource;
import javax.imageio.ImageIO;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import org.apache.catalina.Context;
import org.apache.catalina.core.ApplicationPart;
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 com.bookstore.entity.Book;
import com.bookstore.entity.Category;
@WebServlet("/UpLoadServlet")
@MultipartConfig()
public class UpLoadServlet extends HttpServlet{
private static final long serialVersionUID = 2687272335062029603L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// 对请求包设置编码
req.setCharacterEncoding("utf-8");
// 告知tomcat如何编码,浏览器如何解码
resp.setContentType("text/html; charset=utf-8");
//获得项目的根目录
String savePath=getServletContext().getRealPath("/image");
// 为了简单,后面也直接就以fileName作为保存文件的名称
SimpleDateFormat dateFormat=new SimpleDateFormat("yyMMddHHmmss");
String fileName=dateFormat.format(new Date())+".jpg";
Part part = req.getPart("file");
System.out.println(part.getContentType());
System.out.println(part.getSize());
Collection
headerNames = part.getHeaderNames();
// 遍历文件上传域的Header Name
for (String headerName : headerNames) {
System.out.println(headerName + "---->" + part.getHeader(headerName));
}
// 将文件保存到项目下的uploads文件夹下,为了简单这里没写判断目录是否存在及创建目录的操作,要先确保该目录已经存在
part.write(savePath + "/" + fileName);
}
}
commons-fileupload实现文件上传
@WebServlet(urlPatterns="/UploadServlet",
initParams={@WebInitParam(name="filePath",value="/image"),@WebInitParam(name="tempPath",value="/temp")})
public class UploadServlet extends HttpServlet{
private static final long serialVersionUID = 2687272335062029603L;
private String filePath; //文件保存路径
private String tempPath; //文件临时目录
@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
//config 不但可以读取web.xml文件的初始值,也可以读取注解中的初始化参数,并复制给filePath、tempPath成员属性
filePath=config.getInitParameter("filePath");
tempPath=config.getInitParameter("filePath");
//servlet上下文,servlet运行环境,对象,容器,application
//获得绝对路径
ServletContext context = getServletContext();
filePath = context.getRealPath(filePath);
tempPath = context.getRealPath(tempPath);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// 对请求包设置编码
req.setCharacterEncoding("utf-8");
// 告知tomcat如何编码,浏览器如何解码
resp.setContentType("text/html; charset=utf-8");
//文件保存路径
File saveDir = new File(filePath);
// 如果目录不存在,就创建目录
if(!saveDir.exists()){
saveDir.mkdir();
}
// 创建文件上传核心类
DiskFileItemFactory factory = new DiskFileItemFactory();
// thrshold: 极限,临界值,表示磁盘缓存 1k
factory.setSizeThreshold(1*1024);
// repository: 储存室,即临时文件目录
factory.setRepository(new File(tempPath));
ServletFileUpload sfu = new ServletFileUpload(factory);
//设置编码
sfu.setHeaderEncoding("UTF-8");
// 设置上传的单个文件的最大字节数为2M
sfu.setFileSizeMax(1024*1024*2);
//设置整个表单的最大字节数为10M
sfu.setSizeMax(1024*1024*10);
try{
// 处理表单请求
List
itemList = sfu.parseRequest(req);
for (FileItem fileItem : itemList) {
// 对应表单中的控件的name
String fieldName = fileItem.getFieldName();
System.out.println("name名称:" + fieldName);
// 如果是普通表单控件
if(fileItem.isFormField()){
String value = fileItem.getString();
//重新编码,解决乱码
value = new String(value.getBytes("ISO-8859-1"),"UTF-8");
System.out.println("普通内容:" + fieldName + "=" + value);
// 上传文件
}else{
// 获得文件大小
Long size = fileItem.getSize();
// 获得文件名
String fileName = fileItem.getName();
System.out.println("文件名:"+fileName+"\t大小:" + size + "byte");
//设置不允许上传的文件格式
if(fileName.endsWith(".exe")){
System.out.println("不支持的文件上传类型");
}else{
//将文件保存到指定的路径
File file = new File(filePath,fileName);
fileItem.write(file);
System.out.println("上传成功");
}
}
}
}catch(FileSizeLimitExceededException e){
req.setAttribute("msg", "文件太大");
}catch(FileUploadException e){
e.printStackTrace();
}catch(Exception e){
e.printStackTrace();
}
}
}