大数据WE阶段(十七)文件上传
生活随笔
收集整理的這篇文章主要介紹了
大数据WE阶段(十七)文件上传
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文件上傳
一、概述
二、 文件上傳開發步驟
相關邏輯的開發
相關類詳解
文件上傳項 FileItem
List<FileItem> parseRequest(HttpServeltRequest request)三、文件上傳時需要注意的點
ie兼容
處理:
if(name.contians("\\")){name = name.subString(name.lastIndexOf("\\")); }示例:
public class UploadServlet extends HttpServlet {public void doGet(final HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {try {response.setCharacterEncoding("utf-8");response.setContentType("text/html;charset=utf-8");//1.創建文件上傳工廠DiskFileItemFactory factory = new DiskFileItemFactory(100, new File(this.getServletContext().getRealPath("WEB-INF/temp")));//2.創建文件上傳的核心類ServletFileUpload fileUpload = new ServletFileUpload(factory);//--判斷當前文件上傳的表單是否滿足enctype=multipart/form-dataif(!fileUpload.isMultipartContent(request)){throw new RuntimeException("請使用正確的文件上傳表單上傳數據!");}//--設置文件名解析時采用的編碼fileUpload.setHeaderEncoding("utf-8");//--單個文件不能超過1MB//fileUpload.setFileSizeMax(1024 * 1024);//--總大小不能超過10MB//fileUpload.setSizeMax(10 * 1024 * 1024);//--設置上傳文件的監聽fileUpload.setProgressListener(new ProgressListener(){long begin = System.currentTimeMillis();public void update(long pBytesRead, long pContentLength,int pItems) { // System.out.print("正在讀取第"+pItems+"個上傳項。。"); // System.out.print("共"+pContentLength+"字節。。"); // System.out.print("已經讀取了"+pBytesRead+"字節。。");long leftBytes = pContentLength - pBytesRead; // System.out.print("剩余"+leftBytes+"字節。。");long now = System.currentTimeMillis();long usetime = (now - begin)/1000 ; // System.out.print("已經用時" + usetime+"秒。。");long speed = usetime == 0 ? 0 : pBytesRead / usetime / 1024; // System.out.print("上傳速度" + speed+"KB/s。。");double per = Math.round(pBytesRead * 10000.0 / pContentLength)/100.0;System.out.println("上傳百分比" + per + "%。。");long lefttime = speed == 0 ? 0 : leftBytes /1024 / speed; // System.out.println("大致剩余時間"+lefttime+"秒");request.getSession().setAttribute("progress", per);}});//--解析request得到FileItem的集合List<FileItem> items = fileUpload.parseRequest(request);//--遍歷每個item分別做處理for(FileItem item : items){if(item.isFormField()){//普通字段項String name = item.getFieldName();String value = item.getString("utf-8");System.out.println(name+"~"+value);}else{//文件上傳項String fname = item.getName();//--處理ie文件名bugif(fname.contains("\\")){fname = fname.substring(fname.lastIndexOf("\\")+1);}//--處理文件名 使其不會重復String savename = UUID.randomUUID().toString()+"_"+fname;//--文件分目錄處理//----獲取文件名的hash 轉換為16進制字符串表現形式 由于文件名隨機 所以 hash值也是散列的String hash = Integer.toHexString(savename.hashCode());//----如果hash不足8位則在前面拼接足夠8位的0while(hash.length()<8){hash += "0";}//----遍歷hash值字符串的每一個字符作為一級目錄拼接String savepath = "/WEB-INF/upload/";for(int i = 0;i<hash.length();i++){savepath += (hash.charAt(i)+"/");}//----創建出該目錄new File(this.getServletContext().getRealPath(savepath)).mkdirs();//----得到輸入流InputStream in = item.getInputStream();//----得到輸出流 路徑就是上面 hash拼接出的路徑+文件名OutputStream out = new FileOutputStream(this.getServletContext().getRealPath(savepath + "/" +savename));//----輸出數據到文件byte [] data = new byte[1024];int n = -1;while((n = in.read(data))!=-1){out.write(data,0,n);}//----關閉流in.close();out.close();//----刪除緩存文件item.delete();}}} catch (FileSizeLimitExceededException e) {response.getWriter().write("文件大小超過限制!!");} catch (Exception e) {throw new RuntimeException(e);}}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}}四、文件上傳進度條的實現
總結
以上是生活随笔為你收集整理的大数据WE阶段(十七)文件上传的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大数据WEB阶段(十六)JavaEE三大
- 下一篇: 大数据WEB阶段(十八)数据库事务