1. 程式人生 > 實用技巧 >C#效能優化:延遲初始化Lazy<T>

C#效能優化:延遲初始化Lazy<T>

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;
    }


}