1. 程式人生 > >springboot-上傳單檔案、多檔案

springboot-上傳單檔案、多檔案

今天通過springboot實現上傳功能時遇到的以下問題

1.檔案上傳大小受到限制

網上很多都是新增spring.http.mutipart,但是yml會報deprecated configuration property...的錯誤,意思就是過時了。

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;
    }