Spring Boot + RESTful + 圖片下載

Photo by Yustinus Subiakto on Unsplash
Photo by Yustinus Subiakto on Unsplash
用 Spring Boot 常常要實作一些 RESTful API,來讓前端程式下載圖片。我們將介紹兩種不同的實作方式。一種是用瀏覽器開啟圖片網址時,會直接將圖片下載成檔案。另外一種是,瀏覽器會直接顯示圖片。

用 Spring Boot 常常要實作一些 RESTful API,來讓前端程式下載圖片。我們將介紹兩種不同的實作方式。一種是用瀏覽器開啟圖片網址時,會直接將圖片下載成檔案。另外一種是,瀏覽器會直接顯示圖片。

下載圖片成檔案

若是希望使用者在前端頁面上點擊圖片網址時,會直接下載圖片成檔案的話,可以參考以下這篇的做法:

直接顯示圖片

若是希望圖片可以直接顯示在瀏覽器上的話,可以用以下的方式。

新增 ImageResourceHttpRequestHandler 並繼承 ResourceHttpRequestHandler,程式碼如下:

import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.resource.ResourceHttpRequestHandler;

import javax.servlet.http.HttpServletRequest;
import java.io.File;

@Component
public class ImageResourceHttpRequestHandler extends ResourceHttpRequestHandler {
    public static final String ATTRIBUTE_FILE = "DOWNLOADING_FILE";

    @Override
    protected Resource getResource(HttpServletRequest request) {
        File file = (File) request.getAttribute(ATTRIBUTE_FILE);
        return new FileSystemResource(file);
    }
}

新增 Controller 來接收請求,然後讓 ImageResourceHttpRequestHandler 來處理請求。

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;

@RestController
@RequestMapping("/images")
public class ImageController {
    @Resource
    private ImageResourceHttpRequestHandler imageResourceHttpRequestHandler;

    @GetMapping("/download")
    public void download(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse)
            throws ServletException, IOException {
        File file = new File("/path/to/image.jpg");
        httpServletRequest.setAttribute(ImageResourceHttpRequestHandler.ATTRIBUTE_FILE, file);
        imageResourceHttpRequestHandler.handleRequest(httpServletRequest, httpServletResponse);
    }
}

用瀏覽器開啟 http://localhost:8080/images/download,圖片會直接顯示在瀏覽器上。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

You May Also Like
Photo by Charles Jackson on Unsplash
Read More

Springdoc-OpenAPI 教學

Springdoc 是一個整合 OpenAPI Specification 和 Spring Boot 的套件。和 SpringFox 套件一樣,它產出 Swagger 文件。兩者不同在於,Springdoc 是用 Swagger 3,而 SpringFox 是用 Swagger 2。
Read More