Dubbo整合SpringCloud圖片顯示問題
Tips:公司項目,記錄一點經驗吧,理解的不對的地方歡迎大神指點
問題:商品圖片上傳功能(公司沒有專門文件服務器)寫的保存目錄直接是保存在docker容器內部目錄下,做的docker外部存儲映射到服務器某個文件夾下面(因爲怕鏡像升級啊什麼的 導致圖片丟失)。下面粘貼一下
Jenkins配置(外部存儲設置 Jenkins構建自動設置)
SpringBoot設置docker容器新增文件夾配置
<plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>0.4.13</version> <configuration> <dockerHost>http://0.0.0.0:2375</dockerHost> <imageName>${docker.image.prefix}/${project.artifactId}</imageName> <imageTags> <imageTag>${project.version}</imageTag> <imageTag>latest</imageTag> </imageTags> <baseImage>frolvlad/alpine-oraclejdk8:slim</baseImage> <volumes>/product-images</volumes> <entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint> <resources> <resource> <targetPath>/</targetPath> <directory>${project.build.directory}</directory> <include>${project.build.finalName}.jar</include> </resource> </resources> </configuration> </plugin>
這樣實際圖片上傳路徑指定/product-images圖片上傳問題就解決了
問題2:因爲圖片直接存儲在數據庫的是相對路徑就是比如(/20180909/image.png)實際項目是在docker容器中,圖片也是在/product-images 。我返回給前端的文件路徑就是這樣的 www.域名/Zool/product-images/20180909/image.png 導致找不到圖片,在測試服務器上還沒發現問題因爲測試機有緩存所以導致了這個問題的一個隱藏,今天打正式版導致圖片不顯示。
思路:項目是SpringBoot 目前我知道的 放到resource目錄下 文件直接項目 然後相對路徑是能讀取到圖片的 但是放到docker下,而且也沒在resource下,(跟docker沒關係)就相當於讀機器上某個文件導致的不讓讀取。
解決辦法:
https://域名/Zool/seeImage?imgPath=/product-images" + catalogProductDto.getImages()
@RequestMapping(value = "/seeImage",method = RequestMethod.GET) public String seeImage(HttpServletRequest request, HttpServletResponse response, @RequestParam(value = "imgPath") String imgPath ) { try { FileInputStream hFile = new FileInputStream(imgPath); //得到文件大小 int i = hFile.available(); byte data[] = new byte[i]; //讀數據 hFile.read(data); response.addHeader("Content-Type",getContentType(imgPath)); response.addHeader("Accept-Ranges","bytes"); //得到向客戶端輸出二進制數據的對象 OutputStream toClient = response.getOutputStreStream(); //輸出數據 toClient.write(data); toClient.flush(); toClient.close(); hFile.close(); return ""; } catch (Exception ex) { ex.printStackTrakTrace(); return "處理失敗"+ex.getMessage(); } } /** * 獲取後綴 * @return */ private String getContentType(String imgPath) { String resultSuffix = ""; try{ String suffix = imgPath.substring(imgPath.lastIndexOf('.')); System.out.println("url中的文件擴展名:"+ suffix); if(".jpg".equals(suffix)){ resultSuffix = "image/jpeg"; } if(".png".equals(suffix)){ resultSuffix = "image/png"; } }catch (Exception e){ e.printStackTrakTrace(); return "處理失敗" + e.getMessage();; } return resultSuffix; }
邏輯:後臺傳給前臺一個請求路徑,前臺請求調用後臺的加載圖片方法,圖片加載以流的方式返回給前臺展示 這個問題解決