?????1.修改表单的enctype: <form action="" method="post" ????????enctype="multipart/form-data"> ??修改后servlet就不能通过req.getParameter("参数名")接受请求参数了 ?????2.导入jar包: ???????commons-fileupload-1.2.2.jar ???commons-io-1.4.jar ?????3.检查method和contentType ???????????boolean isMultipart=ServletFileUpload.isMultipartContent(req); ???????if(!isMultipart){ ????????????return; ?????????} ?????4.创建处理FileItem的工厂对象 ?????FileItemFactory factory=new DiskFileItemFactory(); ?????创建处理文件上传的处理器对象 ??????ServletFileUpload upload=new ServletFileUpload(factory); ??????解析请求对象 ??????List<FileItem> items=upload.parseRequest(req); ??????for(FileItem fileItem:items){ ??????????String fieldName=fileItem.getFiledName(); ??????if(fileItem.isFormField()){ ????????????????String fileName=fileItem.getString("utf-8"); ??????}else{ ??????????String fileName=fileItem.getName(); ??????????String contentType=fileItem.getContentType(); ??????????String realPath=super.getServltContext().getRealPath("/upload"); ??????????fileItem.write(new File(realPath+"/"+fileName)); ??????} ??????} ??????5.文件名处理 ??????使用UUID当做文件名称 ??????String uuid=UUID.randomUUID().toString(); ??????String extension=FilenameUtils.getExtension(fileName); ??????fileName=uuid+"."extension; ??????6.缓存大小和临时目录 ????????设置缓存大小: ???????factory.setSizeThreshold(500*1024); ????设置临时目录: ???????factory.setRepository(new File(""));
2.使用注解上传文件
?@MultipartConfig ????可以通过req.getParamter()接受参数 接受上传文件 ?Part part=req.getPart(""); ?part.write(realPath+"/"+name);
3.文件下载
?接受请求参数: ?????String fileName=req.getParameter("fileName"); ?fileName=new String(fileName.getBytes("ISO-8859-1"),"utf-8"); 找到资源的位置,读取到内存,响应给浏览器: ?????String realPath=super.getServletContext().getRealPath(""); ?String filePath=realPath+"\\"+fileName; ?ServletOutputStream out=resp.getOutputStream(); ?//设置响应头 ??resp.setContenType("application/x-msdownload"); //获取请求头信息Use-Agent ????String userAgent=req.getHeader("User-Agent"); if(userAgent.contain("MSIE")){ ???//IE ???fileName=URLEncoder.encode(fileName,"utf-8"); }else{ //W3C ???fileName=new String(fileName.getBytes("utf-8"),"ISO-8859-1"); } //设置下载的文件名称 resp.setHeader("Content-Disposition","attachment;fileName="+fileName); //将数据响应到浏览器 Files.copy(Paths.get(filePath),out);
9 ??文件上传和下载
原文地址:http://blog.51cto.com/10913595/2071340