Java開發之文件上傳
依賴2個jar包:commons-fileupload,commons-io。
代碼如下:
package com.example.web; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWriter; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; import java.util.UUID; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; import org.apache.commons.io.IOUtils; public class FileUpload extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=utf-8"); PrintWriter out=response.getWriter(); //指定文件存放目錄 String storePath=getServletContext().getRealPath("WEB-INF/files"); File file=new File(storePath); //如果目錄不存在,需要創建 if(!file.exists()){ file.mkdirs(); } //要檢查是不是enctype=multipart/form-data提交過來的數據 boolean isMultipart=ServletFileUpload.isMultipartContent(request); //如果不是,需要處理 if(!isMultipart){ out.write("請將enctype設置成multipart/form-data類型"); response.setHeader("Refresh", "1;URL="+request.getContextPath()); return; } //去生成一個文件上傳的FileUpload對象 DiskFileItemFactory factory=new DiskFileItemFactory(); //設置一個臨時目錄 //factory.setRepository(new File("E:/temp"));temp文件需要臨時創建,我已經刪掉了 ServletFileUpload upload=new ServletFileUpload(factory); //將用戶的請求轉化為List<FileItem> try { List<FileItem> items=upload.parseRequest(request); //遍歷List<FileItem>中的數據 for (FileItem item : items) { //如果部分文件沒有上傳 if("".equals(item.getName())){ continue; } //判斷是普通字段 if(item.isFormField()){ String fieldName=item.getFieldName(); String fieldValue=item.getString("UTF-8"); System.out.println(fieldName+":"+fieldValue); }else{ //是上傳的文件 //需要獲取文件名,有可能是路徑 String fileName=item.getName(); fileName=fileName.substring(fileName.lastIndexOf(File.separator)+1); //文件名同名問題 fileName=UUID.randomUUID().toString()+"_"+fileName; //解決一個文件夾下的文件過多的問題 //用時間來生成子目錄 //String childPath=generateDir(storePath); //用hashcode來生成子目錄 String childPath=generateDir(storePath,fileName); //獲取上傳文件的數據 InputStream is=item.getInputStream(); OutputStream os=new FileOutputStream(storePath+File.separator+childPath+File.separator+fileName); IOUtils.copy(is, os); os.close(); is.close(); //item.delete();//清空臨時文件 } } out.write("文件上傳成功<a href='"+request.getContextPath()+"'>繼續上傳</a>"); } catch (FileUploadException e) { e.printStackTrace(); } } private String generateDir(String storePath, String fileName) { int hashcode=fileName.hashCode(); int dir1=hashcode & 0xf; int dir2=(hashcode & 0xf0)>>4; String childPath=dir1+File.separator+dir2; File file=new File(storePath,childPath); if(!file.exists()){ file.mkdirs(); } return childPath; } private String generateDir(String storePath) { DateFormat df=new SimpleDateFormat("yyyyMMddhhmmss"); String childPath=df.format(new Date()); File file=new File(storePath, childPath); if(!file.exists()){ file.mkdirs(); } return childPath; } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); } }
本文由用戶 wn25 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!