文件上傳是開發中比較常見的功能之一.但是SpringBoot并沒有提供特別的文件上傳技術,而是依賴于SpringMVC的文件上傳技術.在SpringBoot中集成了SpringMVC的很多常用功能,也包含了文件上傳部分,實現起來沒有太多的區別.
本章節我們就講解如何在Spring Boot中實現文件文件上傳.
在SpringMVC時代,提供了MultipartFile這個封裝類,它包含了文件的二進制流和文件相關屬性(文件名、大小等),而在Spring Boot中也是使用此封裝類進行文件上傳的.
MultipartFile是個接口,它的實現類有CommonsMultipartFile和StandardMultipartFile,這里簡單說明:
1??. CommonsMultipartFile: 是基于apache fileupload的解析;
2??. StandardMultipartFile: 是基于j2ee自帶的文件上傳進行解析,也就是使用Servlet3.0提供的javax.servlet.http.Part上傳方式.
我們在正常使用MultipartFile時,無需關心底層是以哪種方式進行文件上傳處理的,SpringMVC會給我們做相應的轉換.
byte[] getBytes(): 獲取文件數據;
String getContentType(): 獲取文件MIME類型,如application/pdf、image/pdf等;
InputStream getInputStream(): 獲取文件流;
String getOriginalFileName(): 獲取上傳文件的原名稱;
long getSize(): 獲取文件的字節大小,單位為byte;
boolean isEmpty(): 是否上傳的文件是否為空;
void transferTo(File dest): 將上傳的文件保存到目標文件中
要想實現文件上傳,必須將表單的method設置為post,并將enctype設置為multipart/form-data.只有這樣,瀏覽器才會把用戶所選擇文件的二進制數據發送給服務器.SpringMVC在文件上傳時,會將上傳的文件映射為MultipartFile對象,并對MultipartFile對象進行文件的解析和保存.
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!--為了解決thymeleaf模板中,對html標簽要求太嚴格的問題!-->
<dependency>
<groupId>net.sourceforge.nekohtml</groupId>
<artifactId>nekohtml</artifactId>
<version>1.9.22</version>
</dependency>
<!--簡化bean的代碼-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
在resource/templates目錄下,創建一個文件上傳頁面。
<!DOCTYPE HTML>
<html>
<head>
<title>pictureUploading</title>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
</head>
<body>
<form enctype="multipart/form-data" method="post" action="/upload">
文件: <input type="file" name="fileUpload"/>
<input type="submit" value="上傳"/>
</form>
</body>
</html>
在resources目錄下,創建一個application.properties配置文件,并設置相關配置屬性。
# Template mode to be applied to templates. See also StandardTemplateModeHandlers.
spring.thymeleaf.mode=LEGACYHTML5
spring.servlet.multipart.enabled=true
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB
#文件上傳目錄(注意Linux和Windows上的目錄結構不同)
#uploadFolder=/root/upload/
#特別要注意此位置
uploadFolder=E:/upload/
創建項目包,在包里創建一個JavaBean,用于對外展示信息。
package com.yyg.boot.domain;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 采用lombok簡化bean
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Message {
/**
*0表示成功,-1表示失敗
*/
int status;
/**
* 向前端返回的內容
*/
String massage;
}
package com.syc.boot.web;
import com.syc.boot.domain.Message;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.util.UUID;
/**
* 實現文件上傳的控制器
*/
@Controller
public class UploadController {
@Value("${uploadFolder}")
private String fileDir;
@RequestMapping("/picUpload")
public String picUpload(){
//跳轉到picUpload.html
return "picUpload";
}
@ResponseBody
@PostMapping("/upload")
public Object upload(MultipartFile fileUpload){
//獲取文件名
String fileName=fileUpload.getOriginalFilename();
//獲取文件后綴名
String suffixName=fileName.substring(fileName.lastIndexOf("."));
//重新生成文件名
fileName=UUID.randomUUID()+suffixName;
//指定本地文件夾存儲圖片
try {
System.out.println("------->>"+fileDir);
File dir=new File(fileDir);
if (!dir.exists()) {
dir.mkdirs();
}
File upload_file=new File(fileDir + fileName);
fileUpload.transferTo(upload_file);
return new Message(0,"success to upload");
} catch (Exception e) {
e.printStackTrace();
return new Message(-1,"fail to upload");
}
}
}
package com.syc.boot;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class UploadWebApplication {
public static void main(String[] args) {
SpringApplication.run(UploadWebApplication.class, args);
}
}
我們接下來啟動程序,訪問文件上傳界面,選擇文件進行上傳,可以看到如下效果,說明文件上傳成功。
我們有時候需要同時上傳多個文件,那么如何實現呢?
我們首先創建一個多文件上傳的html頁面multiUpload.html。
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>多文件上傳</title>
<meta charset="utf-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
<meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no"/>
</head>
<body>
<div>
<div>
<div>
<h3>多個文件上傳</h3>
</div>
<div>
<form method="post" enctype="multipart/form-data" th:action="@{/uploadMultifile}">
<div>
<label for="attachment1">文件上傳: </label>
<div>
<input type="file" name="attachment" id="attachment1" placeholder="請選擇郵件附件"/>
</div>
</div>
<div>
<label for="attachment2">文件上傳: </label>
<div class="col-sm-5">
<input type="file" name="attachment" id="attachment2" placeholder="請選擇郵件附件"/>
</div>
</div>
<div>
<label for="attachment3">文件上傳: </label>
<div>
<input type="file" name="attachment" id="attachment3" placeholder="請選擇郵件附件"/>
</div>
</div>
<div>
<div>
<button type="submit">上 傳</button>
</div>
</div>
</form>
</div>
</div>
</div>
</body>
</html>
要實現多文件上傳,可以在上面的controller中添加一個新的接口方法.
@RequestMapping("/multiUpload")
public String multiUpload(){
//跳轉到multiUpload.html
return "multiUpload";
}
@RequestMapping(value="/uploadMultifile", method=RequestMethod.POST)
@ResponseBody
public Object uploadMultiFile(@RequestParam("attachment") MultipartFile[] fileUpload) {
try {
for (int i=0;i<fileUpload.length;i++){
//獲取文件名
String fileName=fileUpload[i].getOriginalFilename();
//指定本地文件夾存儲圖片
File dir=new File(fileDir);
if (!dir.exists()) {
dir.mkdirs();
}
if (fileUpload[i]!=null){
File upload_file=new File(fileDir + fileName);
fileUpload[i].transferTo(upload_file);
}
}
return new Message(0,"success to upload");
} catch (Exception e) {
e.printStackTrace();
return new Message(-1,"fail to upload");
}
}
我們最終實現了在Spring Boot中的多文件上傳功能.
者:藍色的秋風
轉發鏈接:https://mp.weixin.qq.com/s/cruL9JGZNZQFrMSrzJJWiQ
端上傳文件或者上傳文件夾,HTML+AJAX實現上傳大文件方案,h5批量下載文件,HTTP+斷點續傳,前端處理大文件/視頻分片上傳,斷點續傳,VUE—實現文件上傳(多文件),圖片上傳,VUE 項目大文件上傳下載解決方案,VUE將前端的JSON文件上傳到后臺對應目錄,
JAVASCRIPT之分片上傳,斷點續傳的實際項目實現詳解,大文件上傳如何做斷點續傳?全端+后端結合開發,VUE實現文件上傳(單文件、多文件、分片上傳),JS中實現文件上傳下載的三種解決方案(推薦),JS實現大文件上傳——分片上傳方法,完美解決WEB無法上傳大文件方法,HTML大文件上傳源碼,
WEBUPLOAD組件實現文件上傳功能和下載功能,js大文件上傳下載解決方案,vue大文件上傳下載解決方案
asp.net大文件上傳下載解決方案,.net大文件上傳下載解決方案,webform大文件上傳下載解決方案,jsp大文件上傳下載解決方案,java大文件上傳下載解決方案,JAVASCRIPT 大文件上傳下載切片解決方案,JAVASCRIPT 大文件上傳下載切割解決方案,JAVASCRIPT 大文件上傳下載分割解決方案,JAVASCRIPT 大文件上傳下載分塊解決方案,JAVASCRIPT 大文件上傳下載分片解決方案,web大文件上傳下載解決方案,
網頁大文件上傳下載解決方案,前端大文件上傳下載解決方案,html5大文件上傳下載解決方案,JAVASCRIPT 大文件上傳下載解決方案,支持
之前在網上也找過相關的資料,論壇上也有網友交流過,但是基本上都不太令人滿意,與公司這邊的項目需求相差太遠。文章的話基本上大部分都是重復的內容,幾乎都是講的如何用HTML5來做,但是提到的也不多。
HTML5,VUE2,VUE3,React,javascript等常用前端UI框架,JS框架,網上找的方案大多數都只是一些代碼片段,沒有提供完整的前后端代碼。
原理到是不復雜。上傳位置不能傳錯。用戶主要強調穩定性和兼容性。
之前在網上也搜過相關的資料。論壇里面也有一些網絡交流,但是都不太令人滿意。公司這邊實際上需要的是一成熟的商業解決方案,需要能夠提供成功案例,公司客戶都是國企。
跟項目經理溝通過,這塊網上搜到的文章能用的幾乎沒有。實際上客戶那邊比較在乎兩點。
之前項目上面用Flash比較多一點,現在基本上都是HTML5,斷點續傳除了頁面級以外最好還能夠提供離線支持。
支持IE,Chrome和信創國產化環境,比如銀河麒麟,統信UOS,龍芯,
支持分片,分塊,分段,切片,分割上傳。能夠突破chrome每域名的5個TCP連接限制,能夠突破chrome重啟,關閉瀏覽器續傳的限制。
支持10G,20G,50G,100G文件上傳和續傳,支持秒傳,支持文件夾上傳,重復文件檢測,重復文件校驗
支持文件下載,批量下載,下載斷點續傳,加密下載,端到端加密,加密算法支持國密SM4,多線程下載
支持在服務端保存文件夾層級結構,支持將文件夾層級結構信息保存到數據庫中,支持下載時能夠將文件夾層級結構下載下來,支持下載文件夾,下載文件夾支持斷點續傳,
支持加密傳輸,包括加密上傳,加密下載,加密算法支持國密SM4,
支持云對象存儲,比如華為云,阿里云,騰訊云,七牛云,AWS,MinIO,FastDFS,
提供手機,QQ,微信,郵箱等聯系方式,提供7*24小時技術支持,提供長期技術支持和維護服務,提供遠程1對1技術指導,提供二次開發指導,提供文檔教程,提供視頻教程。
視頻教程:
https://www.ixigua.com/7226245960341389859
1.下載示例
https://gitee.com/xproer/up6-vue-cli
將up6組件復制到項目中
示例中已經包含此目錄
1.引入up6組件
2.配置接口地址
接口地址分別對應:文件初始化,文件數據上傳,文件進度,文件上傳完畢,文件刪除,文件夾初始化,文件夾刪除,文件列表
參考:http://www.ncmem.com/doc/view.aspx?id=e1f49f3e1d4742e19135e00bd41fa3de
3.處理事件
啟動測試
啟動成功
效果
數據庫
源碼工程文檔:https://drive.weixin.qq.com/s?k=ACoAYgezAAw1dWofra
源碼報價單:https://drive.weixin.qq.com/s?k=ACoAYgezAAwoiul8gl
OEM版報價單:https://drive.weixin.qq.com/s?k=ACoAYgezAAwuzp4W0a
控件源碼下載:https://drive.weixin.qq.com/s?k=ACoAYgezAAwbdKCskc
授權碼生成器:https://drive.weixin.qq.com/s?k=ACoAYgezAAwTIcFph1
*請認真填寫需求信息,我們會在24小時內與您取得聯系。