SpringMVC 的文件上傳以及文件下載
- 查看 Maven 的依賴寫法(速度比較快): https://mvnrepository.com/
- 查看 Maven 的依賴寫法以及依賴的 Jar 文件:http://maven.outofmemory.cn/,建議百度查詢的時候直接 groupid/artifactid/ 依賴jar 文件查詢,比在網站內部查詢較快。
一、文件上傳
SpringMVC 使用MultipartResolver 接口處理文件上傳
。MultipartResolver 是一個接口,它的實現類是CommonsMultipartResolver 類
和StandardServletMultipartResolver 類。
- 客戶端發送請求,前端控制器( DispatcherServlet )攔截請求,其中的 checkMultipart() 方法會調用 MultipartResolver 的 isMultipart() 方法判斷請求中是否包含文件。如果請求數據中包含文件,則調用 MultipartResolver 的 resolveMultipart() 方法對請求的數據進行解析,然後將文件數據解析成 MultipartFile 並封裝在 MultipartHttpServletRequest ( 繼承了 HttpServletRequest ) 對象中,最後傳遞給 Controller。
- 綜上所述,
前端控制器攔截請求後,會判斷請求是否包含文件,文件請求交由 MultipartHttpServletRequest 處理。
(一)上述兩種實現類(CommonsMultipartResolver 與StandardServletMultipartResolver )的區別:
CommonsMultipartResolver 使用 commons Fileupload 來處理 multipart 請求,所以在使用時,必須要引入相應的 jar 包(commons-fileupload)。
StandardServletMultipartResolver 是基於 Servlet 3.0 來處理 multipart 請求的,所以不需要引用其他 jar 包。
(二)Jar 包衝突。
我在執行上傳文件的過程中,可能是先導入的 commons-lang3 工具類。
原因如下 :
(一)CommonsMultipartResolver 方式。
- 在 Spring MVC 的配置文件中,加入如下的配置。
- 沒有上述配置文件,將會報異常。出現此異常可能是有兩個原因,
一是沒有配置文件,二是提交的表單需要添加 enctype="multipart/form-data" 內容。
- 就是上述提到的表單提交 要帶着 enctype=“multipart/form-data” 。
表單提交:單文件上傳以及多文件上傳的表單形式。
Ajax 提交方式,完成文件上傳。
文件上傳(JQuery AJAX 的使用)。 - 服務器處理文件。
(二)StandardServletMultipartResolver
- 配置文件,需要配置在 springmvc.xml 文件中。
- 配置所需要的參數,參數位置在 web.xml 中。
- 在服務器中進行上傳文件的操作。同上。
二、文件下載
(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 ,爲上傳下載添加進度條。
- 修改內容。
- 使用內容。