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









