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

springboot 檔案上傳下載

技術標籤:學習筆記springboot

目錄標題

1、引入依賴

引入web和thymeleaf依賴

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

2、html頁面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
<title>Title</title> </head> <body> <h3>多檔案上傳</h3> <form action="/uploads" method="post" enctype="multipart/form-data"> <input type="file" name="mulUploadFile" value="請選擇檔案" multiple>
<!-- multiple支援多檔案上傳 --> <input type="submit" value="上傳檔案"> </form> <h3>檔案下載</h3> <a href="/download?filename=3.jpg" >公孫離.jpg</a> <br> <a href="/download1?filename=2.jpg" >抽象工廠.jpg</a> </body> </html>

3、controller

package com.controller;

import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.InputStreamResource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;

@Controller
public class FileUploadDown {

    @ResponseBody
    @PostMapping("/uploads")
    public String uploads(MultipartFile[] mulUploadFile , HttpServletRequest req){

        int i;
        for (i = 0; i < mulUploadFile.length; i++) {
            if(mulUploadFile[i].isEmpty()){
                return "上傳失敗!檔案不能為空!";
            }
            //獲取原檔名
            String fileName = mulUploadFile[i].getOriginalFilename();
            //目標路徑
            String filePath = "E:/Temp/";
            File file = new File(filePath+fileName);
            try {
                mulUploadFile[i].transferTo(file);
            }
            catch (IOException e){
                e.printStackTrace();
            }
        }
        if(i == mulUploadFile.length) return "檔案上傳成功";
        else return "檔案上傳失敗";
    }

    //檔案下載1,
    // 報異常:getOutputStream() has already been called for this response
    // 但不影響程式的執行
    @GetMapping("/download")
    public String download(HttpServletResponse response , HttpServletRequest request){

        try{
        // 1.得到要下載的檔名稱
        String filename = request.getParameter("filename");
        filename = new String(filename.getBytes("iso8859-1"), "utf-8"); // 解決中文亂碼
        //檔案所在位置
        File file = new File("E:\\", filename);
        if (file.exists()) {

            //設定下載檔案的mimeType
            response.setHeader("content-type", "application/octet-stream");
            response.setContentType("application/octet-stream");
            // 其它瀏覽器
            filename = URLEncoder.encode(filename, "utf-8");

            //檔案正常顯示中文
            response.setHeader("content-disposition", "attachment;filename="
                    + filename);

            FileInputStream fis = new FileInputStream(file);
            BufferedInputStream bis = new BufferedInputStream(fis);
            OutputStream os = response.getOutputStream();// 將要下載的檔案內容通過輸出流寫回到瀏覽器

            byte[] b = new byte[1024 * 100];
            int len = -1;
            int i = bis.read(b);
            while (i != -1) {
                os.write(b, 0, i);
                i = bis.read(b);
            }

            os.close();
            fis.close();
            bis.close();
        } else {
            throw new RuntimeException("下載資源不存在");
        }
        }catch (IOException e){

        }
        return "";
    }

    //檔案下載2
    @GetMapping("/download1")
    public ResponseEntity<InputStreamResource> downloadFile(HttpServletRequest request) throws IOException {
        //獲取檔名
        String filename = request.getParameter("filename");
        //原始檔所在的路徑
        String filePath = "E:\\"+filename;
        FileSystemResource file = new FileSystemResource(filePath);
        //配置請求頭
        HttpHeaders headers = new HttpHeaders();
        headers.add("Cache-Control", "no-cache, no-store, must-revalidate");
        headers.add("Content-Disposition", String.format("attachment; filename=\"%s\"", filename));
        headers.add("Pragma", "no-cache");
        headers.add("Expires", "0");

        return ResponseEntity
                .ok()
                .headers(headers)
                .contentLength(file.contentLength())
                .contentType(MediaType.parseMediaType("application/octet-stream"))
                .body(new InputStreamResource(file.getInputStream()));
    }
}

4、application.properties

# 上傳檔案總的最大值
spring.servlet.multipart.max-request-size=10MB
# 單個檔案的最大值
spring.servlet.multipart.max-file-size=10MB