1. 程式人生 > >Java上傳下載完全解析(一)

Java上傳下載完全解析(一)

  在Java Web開發中,經常會用到上傳與下載檔案,典型的案例即為伺服器獲取上傳的檔案,將其儲存至本地,並獲取其下載的檔案url,客戶端在獲取下載的url後,在伺服器進行下載。下面我們就來說一下Java中檔案的上傳。

  一、設定CommonsMultipartResolver

  在Spring中,我們可以使用CommonsMultipartResolver來上傳檔案,所以我們需要宣告一個CommonsMultipartResolver的bean物件,也可以明確的告訴Spring上傳檔案的大小限制:

  <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="defaultEncoding" value="utf-8"></property>
        <property name="maxUploadSize" value="10485760"></property>
        <property name="maxInMemorySize" value="40960"></property>
 </bean>

 其中的maxUploadSize即為最大上傳的大小,單位為B,所以10485760為10M

 二、CommonsMultipartResolver的使用:

  1、得到CommonsMultipartResolver物件:

CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext()); //其中request即為我們請求的HttpServletRequest物件

  2、判斷請求是否為MultiPart File檔案上傳請求:

boolean isFileUpload = multipartResolver.isMultipart(request);

三、MultipartHttpServletRequest的使用

  在確定了是多檔案上傳的請求後,即可以將HttpServletRequest轉成MultipartHttpServletRequest物件,MultipartHttpServletRequest物件封裝了檔案上傳的檔案物件,可以通過此物件直接得到檔案物件。

  1、得到檔名稱列表的迭代器:

  Iterator<String> iter = multiRequest.getFileNames();

  2、取得上傳的檔案:

 MultipartFile file = multiRequest.getFile(iter.next());

四、上傳的示例程式碼:

    @ResponseBody
    @RequestMapping("/up")
    public FileUploadResponse upload(HttpServletRequest request) throws IllegalStateException, IOException, NoSuchAlgorithmException {

        String fileHttpPath = "";
        //建立一個通用的多部分解析器
        CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext());
        //判斷 request 是否有檔案上傳,即多部分請求
        if (multipartResolver.isMultipart(request)) {
            //轉換成多部分request
            MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;
            //取得request中的所有檔名
            Iterator<String> iter = multiRequest.getFileNames();
            while (iter.hasNext()) {
                //記錄上傳過程起始時的時間,用來計算上傳時間
                int pre = (int) System.currentTimeMillis();
                //取得上傳檔案
                MultipartFile file = multiRequest.getFile(iter.next());
                if (file != null) {
                    //取得當前上傳檔案的檔名稱
                    String myFileName = file.getOriginalFilename();
                    //如果名稱不為空,說明該檔案存在,否則說明該檔案不存在
                    if (!myFileName.trim().isEmpty()) {
                        System.out.println(myFileName);

                        String fileName = getRondomFileName() + getFileType(myFileName);
                        //定義本地路徑
                        String path = filePath + fileName;
                        File localFile = new File(path);
                        file.transferTo(localFile);

                        fileHttpPath = fileDownloadPath + fileName;
                    }
                }
                //記錄上傳該檔案後的時間
                int finaltime = (int) System.currentTimeMillis();
                System.out.println(finaltime - pre);
            }

        }
        FileUploadResponse uploadResponse = new FileUploadResponse();
        uploadResponse.setFilePath(fileHttpPath);
        return uploadResponse;
    }

五、

  下一篇的地址為Java上傳下載完全解析(二) ,會講Java Web中檔案的下載與檔案位置配置資訊在開發與生產環境中的切換方法。  

  另外此專案的github地址為FileService,裡面會有上面原始碼中沒有的一些工具類,歡迎大家下載,如果感覺有幫助的話,也可以star一下哦。