1、使用Servlet3.0的新特性实现文件上传
实现文件上传需要以下两项内容:
①添加@MultipartConfig注解
②从request对象中获取Part文件对象
@MultipartConfig注解需要标注在@WebServlet注释之上,@MultipartConfig注解的常用属性有如下:
属性名 |
类型 | 是否可选 | 描述 |
fileSizeThreshold |
int | 是 | 当数据量大于该值时,内容将被写入文件 |
location |
String | 是 | 存放临时生成的文件地址 |
maxFileSize |
long | 是 | 允许上传的文件最大值。默认值为-1,表示没有限制 |
maxRequestSize |
long | 是 | 针对该multipart/form-data请求的最大数量,默认值为-1,表示没有限制 |
③getPart(String name):name参数表示请求的name文件
④Collection<Part> geParts():
@WebServlet("/uploadServlet") @MultipartConfig() public class UploadServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("你好"); resp.setContentType("text/html;charset=UTF-8"); //存储路径 String savePath = req.getServletContext().getRealPath("/WEB-INF/uploadFile"); System.out.println(savePath); Part part = req.getPart("file1");//获取用户上传的文件 //servlet 3.0没有提供直接获取文件名的方法,需要从请求头中解析出来 //如:Content-Disposition: form-data; name="file1"; filename="游戏王.png" String header = part.getHeader("Content-Disposition");//获取header //解析出文件名 String fileName = ParseHeader.getFileName(header); part.write(savePath+ File.separator+fileName); System.out.println(fileName); } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doPost(req,resp); } }
//解析请求头,获取文件名( Content-Disposition: form-data; name="file"; filename="游戏王.png") public static String getFileName(String header){ String[] headerParams = header.split(";"); //在不同的浏览器下,数组里面的内容稍有区别 //火狐或者google浏览器下:tempArr1={form-data,name="file",filename="游戏王.png"} //IE浏览器下:tempArr1={form-data,name="file",filename="E:游戏王.png"} String[] headerParam = headerParams[2].split("="); return headerParam[1].substring(headerParam[1].lastIndexOf("\")+1).replaceAll(""",""); }
2、使用Commons-FileUpload组件实现文件上传
①表单form配置:将enctype属性设置为multipart/form-data
②添加文件域:<input type="file" name="file" size="尺寸" />
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String adjunctname; String fileDir = "e:/file";//指定上传文件的保存路径 String message = "文件上传成功"; String address = ""; if(ServletFileUpload.isMultipartContent(req)){//判断是否是上传文件 DiskFileItemFactory factory = new DiskFileItemFactory(); factory.setSizeThreshold(20*1024);//设置内存中允许存储的字节数 factory.setRepository(factory.getRepository());//设置存放临时文件的目录 ServletFileUpload upload = new ServletFileUpload(factory);//创建新的上传文件句柄 int size = 2*1024*1024;//指定上传文件的大小上限 List<FileItem> formLists = null; try { formLists = upload.parseRequest(req);//获取上传文件的集合 }catch (FileUploadException e){ e.printStackTrace(); } for (FileItem fileItem : formLists) { if (!fileItem.isFormField()){//忽略不是文件域的表单域 String fileName = fileItem.getName();//获取上传文件的名称 if(fileItem.getSize()>size){ message = "您上传的文件太大,请选择不超过2M的文件"; break; } String adjunctsize = Long.toString(fileItem.getSize());//获取上传文件的大小 if((fileName==null) || (fileName.equals("")) && (adjunctsize.equals("0"))) {//如果上传文件为空 continue; } adjunctname = fileName.substring(fileName.lastIndexOf("\"),fileName.length()); address = fileDir + File.separator + adjunctname; File saveFile = new File(address); try { fileItem.write(saveFile); } catch (Exception e) { e.printStackTrace(); } } } req.setAttribute("result",message);//将提示信息保存在request对象中
RequestDispatcher requestDispatcher = req.getRequestDispatcher("index.jsp");
requestDispatcher.forward(req,resp);
} }
3、Spring文件上传
使用spring实现文件上传功能,首先需要在DispatcherServlet上下文中添加分段文件解析器。这样,每个请求就会被检查是否包含上传文件,如果有,则应用上下文中已经定义的MultipartResolver就会被调用。
①在dispatcher-servlet.xml中配置文件上传解析器
<bean name="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="defaultEncoding" value="UTF-8" /> //设置编码格式 <property name="maxUploadSize" value="50000" /> //限制上传文件大小 <property name="uploadTempDir" value="upload/temp" /> //设置临时文件夹 </bean>
②定义上传表单页面
<form action="${pageContext.request.contextPath}/upload" method="post" enctype="multipart/form-data">
上传文件:<input type="file" name="uploadFileName" value="" /><br/>
<input type="submit" value="上传" />
<input type="reset" value="重置" />
</form>
③编写文件上传控制器
@Controller public class FileUploadController { @RequestMapping("/upload") public String fileUpload(MultipartFile multipartFile, HttpSession session) throws Exception{ if(multipartFile.getSize()>0){//如果没有选择文件,则跳转到错误页面 //获取文件名 String fileName = multipartFile.getName(); if(fileName.endsWith("jpg")||fileName.endsWith("gif")){//限制上传类型 String path = "d:/file"; File localFile = new File(path+File.separator+fileName); multipartFile.transferTo(localFile); } } return null; } }