springboot上傳
A. SpringBoot + SFTP 實現文件上傳與下載實戰
SFTP介紹
實戰
1. 相關依賴(基於SpringBoot)
2. 相關配置
3. 將application.properties中配置轉為一個Bean
4. 將上傳下載文件封裝成Service
5. 上傳文件
6. 下載文件
7. 刪除文件
8. 最後
B. springboot zip文件上傳無法解壓
解決方法如下:
1、使用xshell登錄伺服器。
2、安裝lrzsz軟體。
3、使用rz-y命令然後進行文件上傳。
4、使用sz命令下載,命令格式如下,之後就可以重新試一下文件上傳後能不能解壓。
C. springboot上傳文件出錯IOException: The temporary upload location
現象:
上傳excel,出現報錯:
[Request processing failed; nested exception is org.springframework.web.multipart.MultipartException: Could not parse multipart servlet request; nested exception is java.io
.IOException: The temporary upload location [/tmp/tomcat.3814974221022613431.8080/work/Tomcat/localhost/ROOT] is not valid] with root causejava.io
.IOException: The temporary upload location [/tmp/tomcat.3814974221022613431.8080/work/Tomcat/localhost/ROOT] is not valid
原因:
1.spring boot的應用服務在啟動的時候,會生成在操作系統的/tmp目錄下生成一個Tomcat.*的文件目錄,用於"java.io.tmpdir"文件流操作
2.程序對文件的操作時:會生成臨時文件,暫存在臨時文件中;
linux 系統的tmpwatch 命令會刪除10天未使用的臨時文件;
長時間不操作,導致/tmp下面的tomcat臨時文件目錄被刪除,且刪除的文件不可恢復,上傳文件時獲取不到文件目錄,報錯
解決方案:
1.重啟服務,臨時方案:會重新生成tomcat目錄,但是生產環境不建議如此操作;
2.1增加服務配置,自定義baseDir:
2.2啟動時增加參數-Djava.io.tmpdir=自定義目錄
3.修改tmpwatch 刪除文件的邏輯,系統級別的命令,不建議操作
4.在網上看到有:編碼的方式catch異常,生成刪除的文件夾;(方法未驗證)
參考:
https://github.com/spring-projects/spring-boot/issues/5009
https://github.com/spring-projects/spring-boot/issues/9616
D. SpringBoot上傳文件大小設置
在做項目的時候,遇到這樣的問題
org.springframework.web.multipart.MultipartException
是上傳文件大小大於默認大小了,springboot默認單次上傳的文件不超過1M,如果要上傳更大的文件需要在 application.yml 文件中更改設置。
max-file-size 是單個文件大小
max-request-size 是設置總上傳的數據大小
根據自己需求定義吧,Mb和Kb都可以,大小寫也都隨意
E. SpringBoot超大文件上傳如何實現
不管什麼技術,超大文件上傳(超出一次tcp上限)都是要做分片和合並的,無非是自己做還是找控制項的差別。
另外,springboot是後台接收,前端實現是由前端框架負責,比如vue。
以下是Vue+Springboot實現大文件上傳的二種方式:
1、利用ElementUI的el-upload
優點:
簡單方便,可以實現功能
缺點:
上傳速度太慢,沒有分片單線程上傳1個G的文件即使在區域網也很慢
上傳顯示的進度條不準確,進度已經100%了,但是還需要等很久在服務端才生成完文
2、利用網路的webuploader
優點:
WebUploader是網上比較推薦的方式,分片上傳大文件速度很快。
缺點:
必須依賴 jquery
不能 import 導入,只能在 index.html 里包含。
3. 利用vue-uploader
vue-uploader 是基於vue的uploader組件,預設就是分片上傳。
通過npm安裝,基本流程參考github上的說明即可。
上傳的基本原理就是前端根據文件大小,按塊大小分成很多塊,然後多線程同時上傳多個塊,同時調用服務端的上傳介面,服務端會生成很多小塊小塊的文件。
所有塊都上傳完之後,前端再調用一個服務端的merge介面,服務端把前面收到的所有塊文件按順序組合成最終的文件。
F. spring boot 配置最大上傳文件大小 在Linux環境下不生效問題
Spring Boot 默認最大request size 為10MB(1048576 bytes)。
需要設置以下兩個參數
Spring Boot 1.3.x或者之前
multipart.maxFileSize=100Mb
multipart.maxRequestSize=1000Mb
Spring Boot 1.4.x或者之後
spring.http.multipart.maxFileSize=100Mb
spring.http.multipart.maxRequestSize=1000Mb
很多人設置了multipart.maxFileSize但是不起作用,是因為1.4版本以上的配置改了,詳見官方文檔: spring boot 1.4
如果是前端發布到nginx下的還需要配置config/nginx.config
因為nginx默認最大上傳大小為1M,所以要在service-name後面加上 client_max_body_size = 10M;
參考: https://www.cnblogs.com/parasis/p/6422480.html
G. SpringBoot上傳文件大小限制的配置
使用SpingBoot框架上傳文件時,如果文件大小超過了1MB,會報錯:
原因是SpringBoot內置的Tomcat的文件傳輸默認單個文件最大1M,單次請求文件總數大小為10M。
解決方法:
可以在SpingBoot的application.yml配置文件中進行修改
SpingBoot2.0版本之前:
SpingBoot2.0版本之後:
H. springboot調整上傳文件大小限制
Spring Boot文件上傳,文件過大導致異常the request was rejected because its size (xxx) exceeds the configured maximum (xxx)
當進行文件操作時,如果文件體積過大,會拋出上述錯誤。解決方案有兩種,一種是通過復寫MultipartConfigElement;另一種是修改配置文件application.yml中multipart相關參數。
通過setMaxRequestSize限制限制上傳的多個文件的總大小,setMaxFileSize限制單個文件的最大值。
properties配置:
參考:
https://blog.csdn.net/gnail_oug/article/details/80324120
https://ld246.com/article/1592018534503
https://blog.csdn.net/qq_27886773/article/details/102695145
I. springboot多文件上傳
MultipartFile提供了以下方法來獲取上傳文件的信息:
getOriginalFilename,獲取上傳的文件名字;
getBytes,獲取上傳文件內容,轉為位元組數組;
getInputStream,獲取一個InputStream;
isEmpty,文件上傳內容為空,或者根本就沒有文件上傳;
getSize,文件上傳的大小。
transferTo(File dest),保存文件到目標文件系統;
同時上傳多個文件,則使用MultipartFile數組類來接受多個文件上傳:
//多文件上傳 @RequestMapping(value = "/batch/upload", method = RequestMethod.POST)
@ResponseBody public String handleFileUpload(HttpServletRequest request){
List<MultipartFile> files = ((MultipartHttpServletRequest) request)
.getFiles("file");
MultipartFile file = null;
BufferedOutputStream stream = null;
for (int i = 0; i < files.size(); ++i) {
file = files.get(i);
if (!file.isEmpty()) {
try {
byte[] bytes = file.getBytes();
stream = new BufferedOutputStream(new FileOutputStream(
new File(file.getOriginalFilename())));
stream.write(bytes);
stream.close();
} catch (Exception e) {
stream = null;
return "You failed to upload " + i + " => " + e.getMessage();
}
} else {
return "You failed to upload " + i
+ " because the file was empty.";
}
}
return "upload successful";
}
可以通過配置application.properties對SpringBoot上傳的文件進行限定默認為如下配置:
spring.servlet.multipart.enabled=true
spring.servlet.multipart.file-size-threshold=0
spring.servlet.multipart.location=
spring.servlet.multipart.max-file-size=1MB
spring.servlet.multipart.max-request-size=10MB
spring.servlet.multipart.resolve-lazily=false
enabled默認為true,既允許附件上傳。
file-size-threshold限定了當上傳文件超過一定長度時,就先寫到臨時文件里。有助於上傳文件不佔用過多的內存,單位是MB或KB,默認0,既不限定閾值。
location指的是臨時文件的存放目錄,如果不設定,則web伺服器提供一個臨時目錄。
max-file-size屬性指定了單個文件的最大長度,默認1MB,max-request-size屬性說明單次HTTP請求上傳的最大長度,默認10MB.
resolve-lazily表示當文件和參數被訪問的時候再被解析成文件。
J. Spring boot上傳文件時MultipartFile為空問題
首先我貼下我出問題的環境:
form 表單:
1.enctype="multipart/form-data" 這個要有
2.name="file" file要有name
後端
可問題來了,後端收到的file總是null。
後來研究了一會兒才發現是因為自己在@configuration定義了 MultipartResolver bean的緣故
要解決null的問題,只要把自己定義的這個 MultipartResolver bean去掉就好了
原因在於:如果你使用的springboot那麼springboot會自動給你配置 MultipartResolver bean
我看到這的時候還是不明白,為什麼我自己定義 MultipartResolver 就不行呢,照理說使用自己的配置而不使用springboot的自動配置是完全沒問題的。
後來debug的時候我發現問題應該是出在了 MultipartFile