1. 程式人生 > >檔案上傳下載及自己封裝jar包

檔案上傳下載及自己封裝jar包

檔案上傳下載及jar包封裝

表單要求

對於表單上傳,要求使用post請求方式,並且 enctype必須是如下型別

method="post" enctype="multipart/form-data" 

上傳程式碼

當表單中的型別指定為multipart/form-data 時,無法通過getParameter獲取請求引數,使用第三方jar包

commons-fileupload-1.2.2.jar
commons-io-2.0.1.jar

response.setContentType("text/html;charset=UTF-8");
request.setCharacterEncoding("UTF-8");//
// 但它可以解決上傳檔案 的檔名為中文的亂碼問題
String storagePath = getServletContext().getRealPath("/image");
// 判斷當前資料夾是否存在,如果不存在,就建立一個新的
File file = new File(storagePath);
if (!file.exists()) {
    file.mkdirs();
}
// 判斷表單是否是規定格式
boolean multipartContent = ServletFileUpload
            .isMultipartContent(request);
// 如果不是規定格式,提示表單問題
if (!multipartContent) {
    response.getWriter().write("表單有問題");
    return;
}
// 獲取一個能夠去表單檔案的工廠
FileItemFactory fileItemFactory = new DiskFileItemFactory();
// 建立上傳的物件
ServletFileUpload servletFileUpload = new ServletFileUpload(
            fileItemFactory);
try {
    //解析請求-獲取表單中的欄位集合
    List<FileItem> parseRequest = servletFileUpload
                .parseRequest(request);
        //遍歷集合
        for (FileItem fileItem : parseRequest) {
            //判斷是否是普通欄位
            if (fileItem.isFormField()) {
                //獲取欄位名稱
                String fieldName = fileItem.getFieldName();
                System.out.println(fieldName);
                //獲取欄位value
                String string = fileItem.getString("UTF-8");
                System.out.println(string);
            } else {
                // 說明是上傳的檔案
                String name = fileItem.getName();
                // 自己拼接路徑
                String savePath = storagePath + "/"
                        + name.substring(name.lastIndexOf("/") + 1);
                // 開始讀取檔案,然後寫入到儲存的資料夾下
                FileOutputStream fileOutputStream = new FileOutputStream(
                        new File(savePath));
                //因為是檔案,以流的形獲取
                InputStream inputStream = fileItem.getInputStream();
                //使用工具類,讀取表單中的檔案,然後複製到輸出流中去
                IOUtils.copy(inputStream, fileOutputStream);
                //關閉流
                fileOutputStream.close();
                inputStream.close();
            }
        }

    } catch (FileUploadException e) {
        e.printStackTrace();
    }
}

上傳優化

  • 1.得到上傳的檔案要儲存的位置,如果不想被隨便訪問,請放置到WEB-INF資料夾下邊

    String storePath = getServletContext().getRealPath("/WEB-INF/images");
    
  • 2.判斷檔案上傳的型別,如果對於要求上傳圖片的需求,新增圖片的限制

    String mime = item.getContentType();//MIME型別    image/jpeg  image/bmp  
    if(mime.contains("image")){
    if("".equals(item.getName())){
            continue;
    }
    
  • 3.檔名同名的問題,使用UUID生成一個唯一的隨機名稱

    fileName = UUID.randomUUID().toString()+"_"+fileName;
    
  • 4.分資料夾儲存圖片-按照日期方式儲存圖片

    public String createDirByDate(String path){
    DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
    String dir = df.format(new Date());
    File file = new File(path +File.separator+dir);
    if(!file.exists()){
        file.mkdirs();
    }
    return dir;
    }
    
  • 5.分資料夾儲存圖片二-按照Hash值儲存圖片

    public String createDirByHashCode(String path,String fileName){
    int hashcode = fileName.hashCode();//得到一個字串的hashcode碼   "
    int dir1 = hashcode&0xf;   //位與  得到一級子目錄  (16個)
    int dir2 = (hashcode & 0xf0)>>4;// 得到的結果
    String childPath = dir1+File.separator+dir2;
    
    File file = new File(path,childPath);//第一個引數是父目錄,第二個引數是子目錄
    if(!file.exists()){
        file.mkdirs();
    }
    return childPath;
    

    }

    String savePath = storePath+File.separator+createDirByHashCode(storePath,fileName)+File.separator+fileName;
    

檔案下載

  • 對於檔案下載,主要分為兩個步驟

  • 第一步:設定下載的響應頭

    response.setHeader("Content-Dispostion", "attachment;fileName="
                + URLEncoder.encode(name, "UTF-8"));
    
  • 第二步:讀取檔案流,通過響應的輸出流打給客戶端

    String name = realPath.substring(realPath.lastIndexOf("_"));
        response.setHeader("Content-Dispostion",    "attachment;fileName="
                + URLEncoder.encode(name, "UTF-8"));
        FileInputStream fileInputStream = new FileInputStream(new   File(
                realPath));
        ServletOutputStream outputStream =  response.getOutputStream();
        IOUtils.copy(fileInputStream, outputStream);
        fileInputStream.close();
        outputStream.close();
    

自行封裝檔案上傳的jar包

  • 對於像上傳這樣的常用功能,如果每次上傳都寫100 200行程式碼豈不是累屎,於是我們封裝成工具類,來搞定這個事情

  • 定義一個靜態的上傳方法,要求提供三個引數,儲存路徑,請求引數,要封裝成的物件T

  • 主要的程式碼和上傳程式碼一致,不過,需要重點說的就是裡邊有一塊反射的內容,對於T這個物件,要求在定義的時候就和表單中的欄位名稱一致,這樣就可以做到通過反射屬性名,來設定屬性的值並不是多麼高大上的東東…

    public static <T> void upload(String storagePath,
        HttpServletRequest httpServletRequest, T t) {
    
    boolean multipartContent = ServletFileUpload
            .isMultipartContent(httpServletRequest);
    
    // 上傳檔案的工廠
    FileItemFactory fileItemFactory = new DiskFileItemFactory();
    // 臨時檔案
    // 上傳檔案的物件
    ServletFileUpload servletFileUpload = new ServletFileUpload(
            fileItemFactory);
    // 解析請求
    try {
        List<FileItem> parseRequest = servletFileUpload
                .parseRequest(httpServletRequest);
    
        Class<? extends Object> tClazz = t.getClass();
        // 遍歷傳遞的資料集合
        for (FileItem fileItem : parseRequest) {
            // 判斷欄位是什麼型別
            boolean formField = fileItem.isFormField();
            // 普通型別
            if (formField) {
                // 獲取欄位名--name -password
    
                // username ---反射
                String name = fileItem.getFieldName();
                String value = fileItem.getString("UTF-8");
    
                Field field = tClazz.getDeclaredField(name);
                if (field != null) {
                    // 暴力反射
                    field.setAccessible(true);
                    field.set(t, value);
                }
            } else {
                // 上傳的檔案型別
                // 檔案的名稱 c:/aa/ab.jpg
                // image/ab.jpg
                String name = fileItem.getName();
                String fileName = name.substring(name.lastIndexOf("/") + 1);
                fileName = UUID.randomUUID() + "_" + fileName;
                // 獲取流的資訊
                InputStream inputStream = fileItem.getInputStream();
                // 檔案最終儲存到的位置
                String targetPath = storagePath + "/"
                        + createDirByHashCode(storagePath, fileName) + "/"
                        + fileName;
                // 把流寫到本地
                FileOutputStream fileOutputStream = new FileOutputStream(
                        new File(targetPath));
                // pic
                Field field = tClazz.getDeclaredField(fileItem
                        .getFieldName());
                if (field != null) {
                    // 暴力反射
                    field.setAccessible(true);
                    field.set(t, targetPath);
                }
                IOUtils.copy(inputStream, fileOutputStream);
                inputStream.close();
                fileOutputStream.close();
            }
        }
    
    } catch (Exception e) {
        e.printStackTrace();
    }
    
    }
    
  • 順便把下載的方法做一下簡單封裝,提供下載的路徑,提供一個響應

    public static void downLoad(String path, HttpServletResponse resp) {
    
    try {
        FileInputStream fileInputStream = new FileInputStream(new File(path));
        // 輸出流
        ServletOutputStream outputStream = resp.getOutputStream();
    
        IOUtils.copy(fileInputStream, outputStream);
    
        String name = path.substring(path.lastIndexOf("/") + 1);
    
        // 通知瀏覽器下載 檔名稱
        resp.setHeader("Content-Dispostion", "attachment;fileName="
                + URLEncoder.encode(name, "UTF-8"));
        // 關流
        fileInputStream.close();
        outputStream.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
    
    }
    
  • 如果你感覺搞成工具類還不過癮,不妨給它做成jar包,也很簡單,只需要在MyEclipse或者Eclipse中 export-java-jar 就可以啦,這樣你的東西就可以很簡單的讓別人使用啦…

jar包如何使用?

  • 第一步:根據表單封裝Bean

    比如表單中有欄位 name password pic

    那封裝成的Bean就包含 name password pic這幾個屬性

    private String name;
    private String password;
    private String pic;
    
  • 第二步:使用jar包方法

    //準備儲存路徑
    String storagePath = getServletContext().getRealPath("WEB-INF/image");
    //定義空物件
    User user = new User();
    //呼叫工具類方法
    LoadUtils.upload(storagePath, req, user);
    //資料就封裝好了
    System.out.println(user.toString());
    

相關推薦

檔案下載自己封裝jar

檔案上傳下載及jar包封裝 表單要求 對於表單上傳,要求使用post請求方式,並且 enctype必須是如下型別 method="post" enctype="multipart/form-data" 上傳程式碼 當表單中的型別指定為mul

JspSmartUpload 實現檔案下載Mysql實現分頁

一、寫在前面 這篇文章主要是分享使用JspSamrtUpload實現多檔案的上傳下載功能,及使用Mysql資料庫的 limit 函式實現檔案顯示列表的分頁顯示功能。 二、需要的jar包 下載後把它複製到web的lib目錄下即可。 三、關鍵程式碼 3.1 多檔案上傳前

簡單的node檔案下載中文亂碼問題解決

1. 基於MEAN的技術棧,使用restful風格的介面2. 在前端程式碼中放置檔案上傳按鈕和處理表單資料<div class="upload-file btn btn-sm btn-primary mb-2"> <span><i class

POI 實現 Excel 檔案下載大資料匯出處理

Java 中操作 Excel 的有兩種比較主流的工具包: JXL 和 POI 。JXL 只能操作 Excel 95、97、2000 等老版本格式資料,也即以 .xls 為字尾的 excel。而 POI 可以操作 Excel 95 及以後的版本,即可操作字尾為 .xls 和 .

檔案 匯入所需的jar啟動服務後依然報錯找不到jar裡的類 ClassNotFoundException

問題報錯:報java.lang.ClassNotFoundException: org.apache.commons.fileupload.FileItemFactory 瀏覽器上報錯404路徑找不到,這裡報404是因為所引的jar包沒有找到 解決了很長時間

Android網路框架Retrofit2使用封裝:Get/Post/檔案/下載

背景 Android開發中的網路框架經過多年的發展,目前比較主流的就是Retrofit了,Retrofit2版本出現也有幾年了,為了方便使用,特封裝了一些關於Retrofit2的程式碼,分享給大家。 框架主要包括: Get請求 Post請求 檔案上傳 檔案下載

利用FtpClient實現下載獲得檔案目錄

sun程式碼中有個FtpClient,雖然沒有把它用做公開的工具包,但我們也還是可以拿它來利用一下. Java程式碼 1./** 2. * FTP檔案上傳與下載 3. * notice: 4. * 之所以每次都要連線一次ftp是讓它的目錄重新返回到

SpringMVC檔案下載資料庫EXCEL匯出

前段時間要做檔案的上傳下載,現在把它寫出來,供大家分享 首先是excel匯出資料庫 @RequestMapping("/exportCustomer") public void expor

android EasyRxRetrofit封裝(包括下載進度監聽)

前言 很久以前封裝過一次RxJava+Retrofit,最近想著把檔案上傳的進度監聽、檔案下載及進度監聽加入進去。由於之前的封裝太過匆忙,可用性太低,所以重新封裝了一個,令其可真正使用於實際專案中,命名為EasyRxRetrofit,使用RxJava2

SpringMVC教程3【檔案下載,靜態資源處理資料校驗】

一,檔案上傳 web.xml配置通用 <?xml version="1.0" encoding=&q

張明貴-Linux文件下載sCRT配置批量管理功能

http ros 系統版本 uname tro 吸引 聯網 上傳 proc 【講課:互動,用提問的方式來吸引聽眾的註意力,聽眾吸收最大化】大學是在許昌學院讀的,在我看來,不幹念PPT的老師就是好講師,因為大部分任課老師自顧自講,沒有互動,傳授的知識我們只是被動的聽,沒有引導

檔案下載時,在form表單中設定屬性enctype=“multipart/form-data”的情況下,如何獲取表單提交的值?

一、問題描述 檔案上傳下載時,在form表單中設定屬性enctype=“multipart/form-data”的情況下,如何獲取表單提交的有關使用者資訊的值?(比如:textfield、radio等屬性中的值) 二、解決方法 1、情況一:沒有對user物件進行封裝 方法:

linux中檔案下載

windows篇 linux檔案下載到windows   sz命令   登入到linux伺服器使用 sz log.log 命令,彈出對話方塊選擇下載檔案的目錄,點選確定即可。   windows檔案上傳到linux   rz命令   登入到linux伺服器使用rz命令,彈出檔

linux壓縮和解壓縮命令,stp本地檔案下載和ssh連線與傳輸

linux 上檔案解壓縮指令 tar命令   解包:tar zxvf FileName.tar   打包:tar czvf FileName.tar DirName      解壓:tar zxvf FileName.tar.gz   壓縮:tar zcvf FileName.

springboot三種配置檔案下載大小的配置

配置檔案為application.yml格式: spring: http: multipart: enabled: true max-file-size: 30MB max-request-size: 30MB第二種: package com.haiyiso

struts2攔截器和檔案下載

一、攔截器(Interceptor) 攔截器是動態攔截Action呼叫的物件,攔截器將Action共用的行為獨立出來,在Action執行前後執行。這也就是我們所說的AOP,它是分散關注的程式設計方法,它將通用需求功能從不相關類之中分離出來;同時,能夠共享一個行為,一旦行為發生變化,不必修改很

含Maven依賴的jar和原始碼到Nexus並下載引入到其他專案中

此為博主(yjclsx)原創文章,如若轉載請標明出處,謝謝! Nexus的搭建、配置和使用請參考:搭建Maven私服、Nexus3功能介紹、Maven+Nexus代理中央倉庫 下面講解如何將第三方或者自己的jar包和原始碼jar包上傳到Nexus私服中,並在專案中引用這個jar

Struts的攔截器和檔案下載

攔截器 首先新建一個攔截器的類,類實現Interceptor介面,記得是xwork2包下的 重寫三個方法,在intercept的方法中執行攔截器前後需要執行的操作, 執行前後的區分為 String invoke=actionInvocation.invoke();//放行 在這行

java 檔案下載刪除

適用於springboot,ssm框架等 // ============檔案刪除=============== @RequestMapping(value = "/deleteFile", method = RequestMethod.GET) @Respo

Struts2 實現檔案下載

檔案上傳對Struts2來說是一件非常容易的事情。Struts2檔案上傳依賴如下jar包 commons-fileupload-x.x.x.jar commons-io-x.x.x.jar 檔案上傳大致步驟: 編寫頁面 配置struts.xml 攔截器會自動接收上傳的檔