9 文件上傳和下載
阿新 • • 發佈:2018-02-12
參數 threshold msi 臨時 iso common out cto chm 1.文件上傳
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 文件上傳和下載