今天通過springboot實作上傳功能時遇到的以下問題
1.檔案上傳大小受到限制
網上很多都是添加spring.http.mutipart,但是yml會報deprecated configuration property...的錯誤,意思就是過時了。
之後在https://blog.csdn.net/csdn710924032/article/details/82753180文章中找到解決方法。将http換為servlet。成功解決問題。
spring:
servlet:
multipart:
enabled: true
max-file-size: 1024mb
max-request-size: 1024mb
第二種方式是通過添加配置類的方式
@SpringBootApplication //聲明被注解标注的類是springboot的入口類
@MapperScan(value = "com.testspringboot.mapper")
@Configuration
public class TestspringbootApplication {
public static void main(String[] args) {
SpringApplication.run(TestspringbootApplication.class, args);
}
@Bean
public MultipartConfigElement multipartConfigElement() {
MultipartConfigFactory factory = new MultipartConfigFactory();
//單個檔案最大
factory.setMaxFileSize("5MB");
/// 設定總上傳資料總大小
factory.setMaxRequestSize("50MB");
return factory.createMultipartConfig();
}
}
通過@Configuration與@bean注解的方法實作。
2.多檔案上傳時一次性選擇多個問題
一次性選擇多個檔案就是在input type ="file”标簽中添加 multiple。
<form method="POST" enctype="multipart/form-data" action="/upload/testuploadimgs">
<p>檔案1:<input type="file" name="file" multiple/></p>
<p><input type="submit" value="上傳" /></p>
</form>
下面是我的代碼:考慮到要經常上傳是以将上傳的方法封裝到一個工具類中。
工具類:
public class FileUtil {
/**
* 第一步:判斷檔案是否為空 true:傳回提示為空資訊 false:執行第二步
* 第二步:判斷目錄是否存在 不存在:建立目錄
* 第三部:通過輸出流将檔案寫入硬碟檔案夾并關閉流
* @param file
* @return
*/
public static String uploadFile(MultipartFile file){
String fileName = file.getOriginalFilename();
String filePath = "D:\\repository\\";
File targetFile = new File(filePath);
//第一步:判斷檔案是否為空
if(file.isEmpty())return fileName+"檔案為空";
//第二步:判斷目錄是否存在 不存在:建立目錄
if(!targetFile.exists()){
targetFile.mkdirs();
}
//第三部:通過輸出流将檔案寫入硬碟檔案夾并關閉流
BufferedOutputStream stream = null;
try {
stream = new BufferedOutputStream(new FileOutputStream(filePath+fileName));
stream.write(file.getBytes());
stream.flush();
}catch (IOException e){
e.printStackTrace();
}finally {
try {
if (stream != null) stream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return fileName+"上傳成功";
}
}
controller層代碼:
//處理檔案上傳
@RequestMapping(value="/testuploadimg", method = RequestMethod.POST)
public @ResponseBody String uploadImg(@RequestParam("file") MultipartFile file, HttpServletRequest request) {
String info = null;
try {
info = FileUtil.uploadFile(file);
} catch (Exception e) {
e.printStackTrace();
}
return info;
}
//處理多檔案上傳
@RequestMapping(value="/testuploadimgs", method = RequestMethod.POST)
@ResponseBody
public String multipleFilesUpload(HttpServletRequest request){
//擷取上傳的檔案數組
List<MultipartFile> files = ((MultipartHttpServletRequest) request).getFiles("file");
//周遊處理檔案
String info = null;
for (MultipartFile file:files) {
try {
String s = FileUtil.uploadFile(file);
info = info+"-"+s;
} catch (Exception e) {
e.printStackTrace();
}
}
return info;
}