引言
在當今的數字化時代,圖片已成為網站、應用和社交媒體中不可或缺的元素。然而,大尺寸的圖片不僅會增加頁面或者客戶端載入時間,還會佔用大量的儲存空間。爲了解決這個問題,可以使用圖片壓縮工具來減小圖片的尺寸,然後再將壓縮後的圖片上傳至物件儲存服務(如阿里雲OSS)。本文將詳細介紹如何利用Tinify壓縮圖片,並將其上傳至OSS,重點介紹圖片壓縮實現方式。
一、Tinify簡介
1.1 圖片壓縮的重要性
隨著網際網路的普及,圖片已成為資訊傳遞的重要載體。然而,大尺寸、高解析度的圖片會佔用大量頻寬和儲存空間,導致網站載入速度變慢。透過壓縮圖片,可以有效減小檔案大小,提高網站效能。
1.2 Tinify概述
Tinify是一個基於雲的圖片壓縮服務,它能夠顯著減小圖片的檔案大小,同時保持圖片的高質量。Tin義提供了豐富的API,可以輕鬆整合到各種專案中。而且還是對外免費開放使用的。
1.3 Tinify的使用方式
Tinify提供了兩種主要的圖片壓縮方式:
第一種:原始檔直接上傳
直接獲取表單請求的MultipartFile檔案,也就是可以從緩衝區(帶二進制字串)上傳影象,並獲取壓縮的影象資料。
byte[] sourceData = Files.readAllBytes(Paths.get("unoptimized.jpg")); byte[] resultData = Tinify.fromBuffer(sourceData).toBuffer();
這種適合OSS上傳,推薦,缺點是會先把壓縮之後的圖片儲存到伺服器,在上傳到oss,可以在上傳之後,刪除圖片。
第二種:圖片URL上傳
只需可以提供一個URL到您的影象,而不必上傳它,這種更適合圖片查詢展示的時候進行壓縮,壓縮之後可以在Source物件中獲取新的圖片URL。
Source source = Tinify.fromUrl("https://cdn.tinypng.com/images/panda-happy.png"); source.toFile("optimized.jpg");
二、OSS簡介
阿里雲OSS(Object Storage Service)是一種海量、安全、低成本、高可靠的雲端儲存服務。使用者可以透過RESTful API在任何時間、任何地點、以任何網際網路裝置訪問OSS上的資料。OSS提供了豐富的功能,如檔案上傳、下載、刪除、共享等,非常適合用於儲存和管理圖片。這裏就不多介紹了,只要做過圖片上傳,相信大家都知道。
三、實現流程
透過上面Tinify壓縮API的介紹,可以看到使用Tinify進行圖片壓縮也是比較容易整合的,只要在上傳OSS前對圖片進行壓縮,在獲取壓縮後最新圖片進行上傳,對原有程式碼改造也不多。具體流程如下:
3.1 檢查檔案大小
判斷上傳的圖片檔案大小是否超過500KB。如果未超過,則不進行壓縮,這一塊可以根據自己業務進行處理。
3.2 設定Tinify API金鑰
使用Tinify.setKey(API_KEY)方法設定Tinify的API金鑰。
3.3 壓縮圖片
使用Tinify.fromBuffer(file.getBytes())方法從檔案位元組流建立Tinify的Source物件。
使用source.toFile(file.getOriginalFilename())方法將壓縮後的圖片儲存到伺服器。
讀取伺服器中壓縮後的圖片輸入流,並將其轉換為MultipartFile物件。
3.4 清理臨時檔案
刪除伺服器上臨時儲存的壓縮原始檔。
完整實現流程圖如下:
四、實現程式碼
4.1 引入依賴
首先,需要在專案中引入Tinify和阿里雲OSS的依賴。
<!-- Tinify --> <dependency> <groupId>com.tinify</groupId> <artifactId>tinify</artifactId> <version>RELEASE</version> </dependency> <!-- 阿里雲OSS --> <dependency> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-sdk-oss</artifactId> <!-- 阿里雲OSS --> <dependency> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-sdk-oss</artifactId> <version>3.14.1</version> </dependency>
4.2 配置Tinify API金鑰
在使用Tinify之前,需要先註冊一個賬號並獲取API金鑰,主要是獲取對應的apiKey,這裏可以到官網直接申請。
public class TinifyConfig { public static final String API_KEY = "your_tinify_api_key"; }
4.3 實現圖片壓縮和上傳功能
以下是實現圖片壓縮和上傳至OSS的核心程式碼:
import com.aliyun.oss.OSS; import com.aliyun.oss.OSSClientBuilder; import com.tinify.Tinify; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; import java.util.UUID; public class ImageUploader { private static final String dir = "your_upload_directory/"; /** * 圖片上傳 * * @param file 原始檔 * @return 壓縮後圖片的URL * @throws IOException */ public String upload(MultipartFile file) { String endpoint = OSSClientConstants.endpointMap.get("lden"); OSS ossClient = new OSSClientBuilder().build(endpoint, OSSClientConstants.ACCESS_KEY_ID, OSSClientConstants.ACCESS_KEY_SECRET); try { String name = file.getOriginalFilename(); String prefix = name.substring(name.lastIndexOf(".")); // 獲取檔案字尾 String filename = dir + UUID.randomUUID() + prefix; // 上傳的檔案路徑和檔名 // 壓縮圖片 InputStream is = compressPic(file); // 上傳阿里OSS ossClient.putObject(bucket, filename, is); // 返回圖片上傳URL return ("https://your_cdn/" + filename); } catch (Exception e) { logger.error("上傳發生錯誤", e); return null; } finally { ossClient.shutdown(); } } /** * Tinify壓縮圖片 * * @param file 原始檔 * @return 壓縮圖片流 * @throws IOException */ public InputStream compressPic(MultipartFile file) throws IOException { InputStream is = file.getInputStream(); // 小於 500kb不壓縮,這塊業務可以自己決定 if (file.getSize() > 500 * 1024) { // 設定Tinify的API金鑰 Tinify.setKey(TinifyConfig.API_KEY); // 從MultipartFile建立Tinify的Source物件,壓縮圖片 Source source = Tinify.fromBuffer(file.getBytes()); // 壓縮之後儲存到伺服器 source.toFile(file.getOriginalFilename()); // 讀取伺服器中壓縮圖片輸入流 byte[] bytes = Files.readAllBytes(Paths.get(file.getOriginalFilename())); is = convertToMultipartFile(bytes, file.getOriginalFilename()).getInputStream(); // 刪除壓縮原始檔 Files.deleteIfExists(Paths.get(file.getOriginalFilename())); } return is; } }
4.4 壓縮效果驗證
程式執行之後,檢視日誌,可以對比壓縮前後圖片大小,可以看到4M圖片壓縮之後變成了1M。
或者直接對比壓縮前後兩張圖片的大小,更加直觀說明。
原圖片:
壓縮之後圖片:
4.5 注意事項
API金鑰安全:請確保Tinify的API金鑰和OSS的訪問金鑰安全,不要洩露給他人,可以統一儲存到安全的配置檔案或資料庫中。
異常處理:在實際應用中,需要對可能出現的異常進行詳細處理,以確保程式的健壯性。
檔案命名:爲了避免檔名衝突,可以使用UUID生成唯一的檔名。
壓縮圖片刪除:爲了避免佔用伺服器記憶體,可以在壓縮之後刪除臨時儲存的壓縮原始檔。
五、總結
透過本文的介紹,瞭解瞭如何利用Tinify壓縮圖片,並將其上傳至阿里雲OSS。這種方法不僅可以減小圖片的檔案大小,提高頁面載入速度,還可以節省儲存空間。希望本文的內容對有所幫助,能夠最佳化Web應用中的圖片管理。