1. 程式人生 > 其它 >springboot-檔案上傳

springboot-檔案上傳

技術標籤:springboot

1.yml配置檔案

spring:
  servlet:
    multipart:
      max-file-size: 1000MB  #單檔案上傳大小
      max-request-size: 1000MB #全部檔案大小

2.pom依賴

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>


3.前端HTML程式碼

<p>單檔案上傳</p>
<form action="upload" method="post" enctype="multipart/form-data">
    檔案:<input type="file" name="file"/>
    <input type="submit">
</form>
<hr/>

<p>檔案下載</p>
<a href="download">下載檔案</a>
<hr>

<p>多檔案上傳</p>
<form action="batch" method="post" enctype="multipart/form-data">
    <p>檔案1:<input type="file" name="file"></p>
    <p>檔案2:<input type="file" name="file"></p>
    <p><input type="submit" value="上傳"></p>
</form>

4.controller程式碼

@RestController
public class FileController {

    private static final String filePath = "E:\\upload\\";
    private static final Logger logger = LoggerFactory.getLogger(FileController.class);

    /**
     * 單檔案上傳
     *
     * @param file
     * @return
     */
    @RequestMapping("/upload")
    public String upload(@RequestParam("file") MultipartFile file) {
        try {
            if (file.isEmpty()) {
                return "檔案為空";
            }
            //獲取檔名
            String fileName = file.getOriginalFilename();
            logger.info("上傳的檔名是:" + fileName);
            //設定檔案的儲存路徑
            String path = filePath + fileName;
            File dest = new File(path);
            //檢測是都存在目錄
            if (!dest.getParentFile().exists()) {
                dest.getParentFile().mkdirs(); //新建資料夾
            }


            file.transferTo(dest); //檔案寫入
            return "上傳成功";
        } catch (IOException e) {
            e.printStackTrace();
        }

        return "上傳失敗";

    }


    /**
     * 多檔案上傳
     *
     * @param request
     * @return
     */
    @PostMapping("/batch")
    public String handleFileUpload(HttpServletRequest request) {
        List<MultipartFile> files = ((MultipartRequest) 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(filePath + file.getOriginalFilename())));
                    stream.write(bytes);
                    stream.close();
                } catch (Exception e) {
                    stream = null;
                    e.printStackTrace();
                    return "第 " + i + " 個檔案上傳失敗 ==> " + e.getMessage();
                }

            } else {
                return "第 " + i + " 個檔案上傳失敗 ==> 因為檔案為空";
            }
        }
        return "上傳成功";
    }

    /**
     * 檔案下載
     */
    @GetMapping("/download")
    public String download(HttpServletResponse response) {
        String fileName = "_DSC1310.ARW";
        if (fileName != null) {
            //設定檔案路徑
            File file = new File(filePath + fileName);
            if (file.exists()) {
                response.setContentType("application/force-download"); //設定強制下載 不開啟
                response.addHeader("Content-Disposition", "attachment;fileName=" + fileName); //設定檔名
                byte[] buffer = new byte[1024];
                FileInputStream fis = null;
                BufferedInputStream bis = null;

                try {
                    fis = new FileInputStream(file);
                    bis = new BufferedInputStream(fis);
                    OutputStream os = response.getOutputStream();
                    int i = bis.read(buffer);
                    while (i != -1) {
                        os.write(buffer, 0, i);
                        i = bis.read(buffer);
                    }
                    return "下載成功";
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    if (bis != null) {
                        try {
                            bis.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                    if (fis != null) {
                        try {
                            fis.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }
        return "下載失敗";
    }
}