天天看點

springboot-上傳單檔案、多檔案

今天通過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;
    }
           

繼續閱讀