SpringMVC 的文件上傳以及文件下載

一、文件上傳

SpringMVC 使用MultipartResolver 接口處理文件上傳。MultipartResolver 是一個接口,它的實現類是 CommonsMultipartResolver 類StandardServletMultipartResolver 類。

  1. 客戶端發送請求,前端控制器( DispatcherServlet )攔截請求,其中的 checkMultipart() 方法會調用 MultipartResolver 的 isMultipart() 方法判斷請求中是否包含文件。如果請求數據中包含文件,則調用 MultipartResolver 的 resolveMultipart() 方法對請求的數據進行解析,然後將文件數據解析成 MultipartFile 並封裝在 MultipartHttpServletRequest ( 繼承了 HttpServletRequest ) 對象中,最後傳遞給 Controller。
  2. 綜上所述,前端控制器攔截請求後,會判斷請求是否包含文件,文件請求交由 MultipartHttpServletRequest 處理。

(一)上述兩種實現類(CommonsMultipartResolver 與StandardServletMultipartResolver )的區別:
CommonsMultipartResolver 使用 commons Fileupload 來處理 multipart 請求,所以在使用時,必須要引入相應的 jar 包(commons-fileupload)。
StandardServletMultipartResolver 是基於 Servlet 3.0 來處理 multipart 請求的,所以不需要引用其他 jar 包。
在這裏插入圖片描述
(二)Jar 包衝突。
我在執行上傳文件的過程中,可能是先導入的 commons-lang3 工具類。
在這裏插入圖片描述
原因如下 :
在這裏插入圖片描述

(一)CommonsMultipartResolver 方式。

  1. 在 Spring MVC 的配置文件中,加入如下的配置。
    在這裏插入圖片描述
  • 沒有上述配置文件,將會報異常。出現此異常可能是有兩個原因,一是沒有配置文件,二是提交的表單需要添加 enctype="multipart/form-data" 內容。
    在這裏插入圖片描述
  1. 就是上述提到的表單提交 要帶着 enctype=“multipart/form-data” 。
    表單提交:單文件上傳以及多文件上傳的表單形式。
    在這裏插入圖片描述
    Ajax 提交方式,完成文件上傳。
    文件上傳(JQuery AJAX 的使用)。
  2. 服務器處理文件。
    在這裏插入圖片描述

(二)StandardServletMultipartResolver

  1. 配置文件,需要配置在 springmvc.xml 文件中。
    在這裏插入圖片描述
  2. 配置所需要的參數,參數位置在 web.xml 中。
    在這裏插入圖片描述
  3. 在服務器中進行上傳文件的操作。同上。

二、文件下載

(1)文件下載伴隨着進度條的實現

  1. Java 項目中模擬進度條的實現。
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.URL;

public class testDownLoad {
	    public static void dowanload(String url, String path)
	            throws IOException {
	        System.out.println("下載中...");
	        InputStream inputStream = null;
	        RandomAccessFile randomAccessFile = null;
	        try {
	            HttpURLConnection urlConnection = (HttpURLConnection) new URL(url).openConnection();
	            urlConnection.setRequestMethod("GET");
	            urlConnection.setConnectTimeout(10 * 1000);
	            File file = new File(path);
	            // 文件夾是否存在
	            if (!file.getParentFile().exists()){
	            	// 文件夾不存在就要創建
	                file.getParentFile().mkdir();
				}
				// 當前的文件存在就要刪除,以接替換新的文件
	            if (file.exists()){
					file.delete();
				}
				// 創建一個新的名字來存儲文件
	            file.createNewFile();
	            int responseCode = urlConnection.getResponseCode();
	            if (responseCode >= 200 && responseCode < 300) {
	                inputStream = urlConnection.getInputStream();
	                int len = 0;
	                byte[] data = new byte[4096];
	                //用於保存當前進度(具體進度)
	                int progres = 0;
	                //獲取文件長度
	                int maxProgres = urlConnection.getContentLength();
	                randomAccessFile = new RandomAccessFile(file, "rwd");
	                //設置文件大小
	                randomAccessFile.setLength(maxProgres);
	                //將文件大小分成100分,每一分的大小爲unit
	                int unit = maxProgres / 100;
	                //用於保存當前進度(1~100%)
	                int unitProgress = 0;
	                while (-1 != (len = inputStream.read(data))) {
	                    randomAccessFile.write(data, 0, len);
	                    progres += len;//保存當前具體進度
	                    int temp = progres / unit; //計算當前百分比進度
	                    if (temp >= 1 && temp > unitProgress) {//如果下載過程出現百分比變化
	                        unitProgress = temp;//保存當前百分比
	                        System.out.println("正在下載中..." + unitProgress + "%");
	                    }
	                }
	                inputStream.close();
	                System.out.println("下載完成...");
	            } else {
	                System.out.println("服務器異常...");
	            }
	        } finally {
	            if (null != inputStream) {
	                inputStream.close();
	            }
	            if (null != randomAccessFile) {
	                randomAccessFile.close();
	            }
	        }
	    }
	 
	    public static void main(String[] args) throws IOException {
	        String path = "D:\\abc\\image.jpg";
	        String url="http://www.dowei.com/d/file/tuku/meinv/2016-01-26/1453788622507000.jpg";
	        dowanload(url, path);
	    }
}

(2)瀏覽器下載。

在這裏插入圖片描述

(2.1)使用 Layui ,爲上傳下載添加進度條。

  1. 修改內容。
    在這裏插入圖片描述
  2. 使用內容。
    在這裏插入圖片描述
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章