//1.创建工厂类DiskFileItemFactory对象
DiskFileItemFactory factory = new DiskFileItemFactory();
//2.使用工厂创建解析器对象
ServletFileUpload fileUpload = new ServletFileUpload(factory);
//3.使用解析器来解析request对象
List list = fileUpload.parseRequest(request);
注意事项:因为文件上传表单采用编码方式multipart/form-data 与传统url编码不同,所有getParameter ()方法不能使用 ,setCharacterEncoding()无法解决输入项乱码问题
jsp:
FileUploadServlet:
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadBase;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.ProgressListener;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Calendar;
import java.util.List;
import java.util.UUID;
/**
* Created by dllo on 17/7/10.
*/
@WebServlet(name = "FileUploadServlet", urlPatterns = "/file")
public class FileUploadServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 因为要使用response打印,所以设置其编码
response.setContentType("text/html;charset=utf-8");
// 创建工厂
DiskFileItemFactory dfif = new DiskFileItemFactory();
// 使用工厂创建解析器对象
ServletFileUpload fileUpload = new ServletFileUpload(dfif);
try {
// 使用解析器对象解析request,得到FileItem列表
List list = fileUpload.parseRequest(request);
// 遍历所有表单项
for(FileItem fileItem : list) {
// 如果当前表单项为普通表单项
if(fileItem.isFormField()) {
// 获取当前表单项的字段名称
String fieldName = fileItem.getFieldName();
// 如果当前表单项的字段名为username
if(fieldName.equals("username")) {
// 打印当前表单项的内容,即用户在username表单项中输入的内容
response.getWriter().print("用户名:" + fileItem.getString() + "
");
}
} else {//如果当前表单项不是普通表单项,说明就是文件字段
String name = fileItem.getName();//获取上传文件的名称
// 如果上传的文件名称为空,即没有指定上传文件
if(name == null || name.isEmpty()) {
continue;
}
// 获取真实路径,对应${项目目录}/uploads,当然,这个目录必须存在
String savepath = this.getServletContext().getRealPath("/WEB-INF/upload");
// 通过uploads目录和文件名称来创建File对象
File file = new File(savepath, name);
// 把上传文件保存到指定位置
fileItem.write(file);
// 打印上传文件的名称
response.getWriter().print("上传文件名:" + name + "
");
// 打印上传文件的大小
response.getWriter().print("上传文件大小:" + fileItem.getSize() + "
");
// 打印上传文件的类型
response.getWriter().print("上传文件类型:" + fileItem.getContentType() + "
");
}
}
} catch (Exception e) {
throw new ServletException(e);
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
ServletContext servletContext = this.getServletContext();
String savepath = servletContext.getRealPath(“/WEB-INF/upload”);
例如用户上传的文件是“我的一寸照片.jpg”,在通过处理后,文件名称为:“891b3881395f4175b969256a3f7b6e10_我的一寸照片.jpg”,这种手段不会使文件丢失扩展名,并且因为UUID的唯一性,上传的文件同名,但在服务器端是不会出现同名问题的
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
DiskFileItemFactory dfif = new DiskFileItemFactory();
ServletFileUpload fileUpload = new ServletFileUpload(dfif);
try {
List list = fileUpload.parseRequest(request);
//获取第二个表单项,因为第一个表单项是username,第二个才是file表单项
FileItem fileItem = list.get(1);
String name = fileItem.getName();//获取文件名称
// 如果客户端使用的是IE6,那么需要从完整路径中获取文件名称
int lastIndex = name.lastIndexOf("\\");
if(lastIndex != -1) {
name = name.substring(lastIndex + 1);
}
// 获取上传文件的保存目录
String savepath = this.getServletContext().getRealPath("/WEB-INF/uploads");
String uuid = CommonUtils.uuid();//生成uuid
String filename = uuid + "_" + name;//新的文件名称为uuid + 下划线 + 原始名称
//创建file对象,下面会把上传文件保存到这个file指定的路径
//savepath,即上传文件的保存目录
//filename,文件名称
File file = new File(savepath, filename);
// 保存文件
fileItem.write(file);
} catch (Exception e) {
throw new ServletException(e);
}
}
//设置上传的单个文件的上限为10kB
fileUpload.setFileSizeMax(1024 * 10);
//设置上传文件的总大小限制
fileUpload.setSizeMax(1024*1024*10);
download.jsp:
<a href=" ">杰哥.jpga><br/>
DownloadServlet:
import org.apache.commons.io.IOUtils;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
/**
* Created by dllo on 17/7/11.
*/
@WebServlet(name = "DownloadServlet", urlPatterns = "/down")
public class DownloadServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String filename = request.getParameter("path");
// GET请求中,参数中包含中文需要自己动手来转换。
// 当然如果你使用了“全局编码过滤器”,那么这里就不用处理了
filename = new String(filename.getBytes("ISO-8859-1"),"UTF-8");
String filepath = this.getServletContext().getRealPath("/WEB-INF/upload" + filename);
File file = new File(filepath);
if (!file.exists()){
response.getWriter().print("您要下载的文件不存在");
return;
}
// 所有浏览器都会使用本地编码,即中文操作系统使用GBK
// 浏览器收到这个文件名后,会使用iso-8859-1来解码
filename = new String(filename.getBytes("GBK"),"ISO-8859-1");
response.addHeader("content-disposition", "attachment;filename=" + filename);
IOUtils.copy(new FileInputStream(file), response.getOutputStream());
}
}