iT邦幫忙

2024 iThome 鐵人賽

0
Software Development

從Servlet到Spring MVC系列 第 31

Day30 Spring MVC - FileUpload and FileDownload

  • 分享至 

  • xImage
  •  

前言

在Day18我們提過使用Servlet如何達到文件上下傳,今日我們來看看Spring MVC如何幫我們達到這一個部分

0.創建module

(1) 請參考Day27 0.創建module
(2) 使用JSON相關設置請參考Day29 (2)

一、FileUpload

#### (1) multipart-config設定
官網文件知道我們可以使用Java的方式對DispatchServlet進行配置或是使用web.xml的方式進行設置一個暫存檔案路徑,如果直接設置/tmp資料夾會因為我們運行在intellij裡面的tomcat暫存路徑並未產生而產生錯誤訊息Temporary upload location is not valid,所以這邊我們會寫一個已經產生的路徑進行配置
web.xml針對DispatchServlet設定暫存資料夾

(2) 使用@RequestParam

使用該註解並設定MultipartFile作為接收參數

範例建置

<servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <multipart-config>
            <location>H:\\tmp</location>
            <max-file-size>20848820</max-file-size>
            <max-request-size>418018841</max-request-size>
            <file-size-threshold>1048576</file-size-threshold>
        </multipart-config>
    </servlet>
@Controller
public class FileController {

    @GetMapping("index")
    public String fileUpload(){
        return "index";
    }

    @PostMapping("fileUpload")
    @ResponseBody
    public String fileUpload(@RequestParam("fileImage")MultipartFile file) throws IOException {
        String fileName = file.getOriginalFilename();
        System.out.println(fileName);
        file.transferTo(new File("H:\\00_fileupload\\" + fileName));

        return "[ "+file.getOriginalFilename()+"]upload success";
    }
}

Demo

https://ithelp.ithome.com.tw/upload/images/20241015/201280840R7Td0ACLq.png

二、FileDownload

檔案下載我們需要設置Content-Type所以我們需要透過ResponseEntity來協助我們達成,記得要引用json相關依賴的lib否則會出現‵No converter for [class org.springframework.core.io.InputStreamResource]‵錯訊

範例建置

同樣寫在FileController中

@Autowired
    private ServletContext context;

    @GetMapping("fileDownload")
    public ResponseEntity<InputStreamResource> fileDownload() throws IOException {
        String fileName = "火影忍者.jpg";
        String filePath = context.getRealPath("download")+ File.separator+fileName;

        FileInputStream fis = new FileInputStream(filePath);
        InputStreamResource resource = new InputStreamResource(fis);

        String filenameUrlEncode = URLEncoder.encode(fileName, "UTF-8");

        ResponseEntity entity = ResponseEntity.ok()
                .contentType(MediaType.APPLICATION_OCTET_STREAM) //設定檔案類型
                .contentLength(fis.available())
                //告訴瀏覽器是檔案下載
                .header("Content-Disposition", "attachment; filename="+filenameUrlEncode)
                .body(resource);

        return entity;
    }

Demo

https://ithelp.ithome.com.tw/upload/images/20241015/20128084BzzWvGiObR.png

Reference

Multipart - Spring MVC Doc


上一篇
Day29 Spring MVC - Response Handling
下一篇
Day31 Spring MVC - Interceptor
系列文
從Servlet到Spring MVC36
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言