用 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,圖片會直接顯示在瀏覽器上。