C#效能優化:延遲初始化Lazy<T>
阿新 • • 發佈:2020-08-24
1.準備工作
jar包
commons-io
commons-fileup
2.使用類介紹
檔案上傳注意事項
常用的類
實現思想:
//1.建立 DiskFileItemFactory 物件,處理檔案上傳路徑和大小的限制 DiskFileItemFactory diskFileItemFactory = getDiskFileItemFactory(tmpFile); //2.獲取 ServletFileUpload ServletFileUpload servletFileUpload = getServletFileUpload(diskFileItemFactory); //3. 處理上傳的檔案 //每一個表單裡面的標籤就是一個FIleItem物件 List<FileItem> fileItems = servletFileUpload.parseRequest(request);
檔名
UUID 是 通用唯一識別碼(Universally Unique Identifier)的縮寫。
程式碼實現:
package com.cb.test; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileItemFactory; import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.ProgressListener; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; import org.junit.jupiter.api.Test; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.util.List; import java.util.UUID; public class Test1 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { super.doGet(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //判斷是帶檔案的表單還是不帶檔案的表單 //web wind裡面的吧,在得到bai上傳檔案之前,首先要判斷客du戶端zhi<form>標記的enctype屬性是否是“multipart/form-data"。 //也可以說是判斷是普dao通表單,還是帶檔案上傳的表單。檔案上傳的表單值不能按普通表單接收值那樣直接獲取。 if(!ServletFileUpload.isMultipartContent(req)){ return;//終止方法 } //建立檔案存放儲存目錄和臨時儲存目錄,WEB-INF下安全,無法直接被訪問 String uploadPath = this.getServletContext().getRealPath("/WEB-INF/upload"); File uploadFile = new File(uploadPath); if(!uploadFile.exists()){ uploadFile.mkdir(); } //檔案太大,放在臨時檔案 String tmpPath = this.getServletContext().getRealPath("/WEB-INF/tmp"); File tmpFile = new File(tmpPath); if(!tmpFile.exists()){ tmpFile.mkdir(); } //上傳檔案,一般需要通過流來獲取,原生req.getInputStream() //這裡我們用apache的上傳檔案元件,commons- fileUpload,依賴commons-io包 //1.建立 DiskFileItemFactory 物件,處理檔案上傳路徑和大小的限制 DiskFileItemFactory diskFileItemFactory = getDiskFileItemFactory(tmpFile); //2.獲取 ServletFileUpload ServletFileUpload servletFileUpload = getServletFileUpload(diskFileItemFactory); //3. 處理上傳的檔案 try { uploadParseRequest(servletFileUpload,req,uploadPath); } catch (FileUploadException e) { e.printStackTrace(); } } private String uploadParseRequest(ServletFileUpload servletFileUpload,HttpServletRequest request,String uploadPath) throws FileUploadException, IOException { String msg = ""; //每一個表單裡面的標籤就是一個FIleItem物件 List<FileItem> fileItems = servletFileUpload.parseRequest(request); for (FileItem fileItem : fileItems) { //判斷FIleItem物件是不是 帶檔案的標籤 false代表是一個上傳檔案 if (fileItem.isFormField()) { //欄位名 String fieldName = fileItem.getFieldName(); //h獲取值 String value = fileItem.getString("utf-8"); System.out.println("key:" + fieldName + "value" + value); } else { //------------------處理檔案------------------// //------------------獲取檔案路徑------------------// //獲取檔名,有些瀏覽器帶路徑名,有些不帶路徑 String uploadFileName = fileItem.getName(); if (uploadFileName.trim().equals("") || uploadFileName == null) { continue; } //獲取檔名 /image/guti/ada.png -> ada.png String fileName = uploadFileName.substring(uploadFileName.lastIndexOf("/") + 1); //獲取檔名字尾 String fileExtName = uploadFileName.substring(uploadFileName.lastIndexOf(".") + 1); System.out.println("檔名:" + fileName + "字尾名" + fileExtName); //UUID 唯一識別符號 String uuid = UUID.randomUUID().toString(); //檔案的真實路徑 String realPath = uploadPath + "/" + uuid; //為每一個檔案建立一個對應的資料夾 File realPathFile = new File(realPath); if (!realPathFile.exists()) { realPathFile.mkdir(); } //------------------儲存檔案------------------// //上傳檔案輸入流 InputStream inputStream = fileItem.getInputStream(); //建立上傳檔案輸出到磁碟流 System.out.println(realPath + "/" + fileName); FileOutputStream fileOutputStream = new FileOutputStream(realPath + "/" + fileName); //定義快取區 byte[] buffer = new byte[1024]; int len = 0; while ((len = inputStream.read(buffer)) > 0) { fileOutputStream.write(buffer, 0, len); } //關閉流 inputStream.close(); fileOutputStream.close(); System.out.println("檔案上傳成功"); //刪除臨時檔案 fileItem.delete(); } } return msg; } private ServletFileUpload getServletFileUpload(FileItemFactory diskFileItemFactory) { ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory); //監聽檔案上傳進度 servletFileUpload.setProgressListener(new ProgressListener() { @Override public void update(long pBytesRead, long pContentLength, int pItems) { //pBytesRead 已讀 pContentLength 檔案大小 System.out.println("已經上傳:"+ pBytesRead + "--總大小 " + pContentLength); } }); //處理亂碼問題 servletFileUpload.setHeaderEncoding("utf-8"); //設定單個檔案最大值 servletFileUpload.setFileSizeMax(1024*1024*10); // 設定總共能上傳檔案最大值 servletFileUpload.setSizeMax(1024*1024*10); return servletFileUpload; } private DiskFileItemFactory getDiskFileItemFactory(File file) { //設定檔案大小和 臨時檔案儲存目錄 DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory(); diskFileItemFactory.setSizeThreshold(1024*1024); diskFileItemFactory.setRepository(file); return diskFileItemFactory; } }