1. 程式人生 > 其它 >【Java】阿里雲oss上傳檔案工具類【親測有效】

【Java】阿里雲oss上傳檔案工具類【親測有效】

技術標籤:Java開發


前置條件:

已有accessKeyId、accessKeySecret等資訊。阿里雲oss授權方式可自行百度。


pom檔案新增依賴:

        <dependency>
            <groupId>com.aliyun.oss</groupId>
            <artifactId>aliyun-sdk-oss</artifactId>
            <version>3.1.0</version>
        </dependency>


配置資訊:

config.properties 配置檔案資訊,value值根據自己實際情況補充完整

# Aliyun Config
aliyun.oss.accessKeyId=
aliyun.oss.accessKeySecret=

# Aliyun OSS Config
aliyun.oss.endpoint=
aliyun.oss.bucketName=
aliyun.oss.folder=""

配置檔案位置:

在這裡插入圖片描述

工具類:

package com.glodon.kgb.utils.oss;

/**
 * @Author;liuz
 * @Description:阿里雲OSS物件儲存工具類
 * @Date:Created in 11:39 2020/12/7
 * @Modified By:
 */
import com.aliyun.oss.OSSClient; import com.aliyun.oss.model.Bucket; import com.aliyun.oss.model.OSSObject; import com.aliyun.oss.model.ObjectMetadata; import com.aliyun.oss.model.PutObjectResult; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.
Value; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.PropertySource; import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; /** * 使用阿里雲OSS儲存物件上傳檔案等工具類 */ @Configuration @PropertySource("classpath:config/config.properties") public class OSSClientUtil { /** * 日誌 */ private static Logger logger = LoggerFactory.getLogger(OSSClientUtil.class); /** * 阿里雲API的金鑰Access Key ID */ private static String accessKeyId; /** * 阿里雲API的金鑰Access Key Secret */ private static String accessKeySecret; /** * 阿里雲API的內或外網域名 */ private static String endpoint; /** * 阿里雲API的bucket名稱 */ public static String bucketName; /** * 阿里雲API的資料夾名稱 */ public static String folder; /** * 獲取阿里雲OSS客戶端物件 * * @return ossClient */ public static OSSClient getOSSClient() { return new OSSClient(endpoint, accessKeyId, accessKeySecret); } /** * 建立儲存空間 * * @param ossClient OSS連線 * @param bucketName 儲存空間 * @return */ public static String createBucketName(OSSClient ossClient, String bucketName) { // 儲存空間 final String bucketNames = bucketName; if (!ossClient.doesBucketExist(bucketName)) { // 建立儲存空間 Bucket bucket = ossClient.createBucket(bucketName); logger.info("建立儲存空間成功"); return bucket.getName(); } return bucketNames; } /** * 刪除儲存空間buckName * * @param ossClient oss物件 * @param bucketName 儲存空間 */ public static void deleteBucket(OSSClient ossClient, String bucketName) { ossClient.deleteBucket(bucketName); logger.info("刪除" + bucketName + "Bucket成功"); } /** * 建立模擬資料夾 * * @param ossClient oss連線 * @param bucketName 儲存空間 * @param folder 模擬資料夾名如"qj_nanjing/" * @return 資料夾名 */ public static String createFolder(OSSClient ossClient, String bucketName, String folder) { // 資料夾名 final String keySuffixWithSlash = folder; // 判斷資料夾是否存在,不存在則建立 if (!ossClient.doesObjectExist(bucketName, keySuffixWithSlash)) { // 建立資料夾 ossClient.putObject(bucketName, keySuffixWithSlash, new ByteArrayInputStream(new byte[0])); logger.info("建立資料夾成功"); // 得到資料夾名 OSSObject object = ossClient.getObject(bucketName, keySuffixWithSlash); String fileDir = object.getKey(); return fileDir; } return keySuffixWithSlash; } /** * 根據key刪除OSS伺服器上的檔案 * * @param ossClient oss連線 * @param bucketName 儲存空間 * @param folder 模擬資料夾名 如"qj_nanjing/" * @param key Bucket下的檔案的路徑名+檔名 如:"upload/cake.jpg" */ public static void deleteFile(OSSClient ossClient, String bucketName, String folder, String key) { ossClient.deleteObject(bucketName, folder + key); logger.info("刪除" + bucketName + "下的檔案" + folder + key + "成功"); } /** * 上傳圖片至OSS * * @param ossClient oss連線 * @param file 上傳檔案(檔案全路徑如:D:\\image\\cake.jpg) * @param bucketName 儲存空間 * @param folder 模擬資料夾名 如"qj_nanjing/" * @return String 返回的唯一MD5數字簽名 */ public static String uploadObject2OSS(OSSClient ossClient, File file, String bucketName, String folder) { String resultStr = null; try { // 以輸入流的形式上傳檔案 InputStream is = new FileInputStream(file); // 檔名 String fileName = file.getName(); // 檔案大小 Long fileSize = file.length(); // 建立上傳Object的Metadata ObjectMetadata metadata = new ObjectMetadata(); // 上傳的檔案的長度 metadata.setContentLength(is.available()); // 指定該Object被下載時的網頁的快取行為 metadata.setCacheControl("no-cache"); // 指定該Object下設定Header metadata.setHeader("Pragma", "no-cache"); // 指定該Object被下載時的內容編碼格式 metadata.setContentEncoding("utf-8"); // 檔案的MIME,定義檔案的型別及網頁編碼,決定瀏覽器將以什麼形式、什麼編碼讀取檔案。如果使用者沒有指定則根據Key或檔名的副檔名生成, // 如果沒有副檔名則填預設值application/octet-stream metadata.setContentType(getContentType(fileName)); // 指定該Object被下載時的名稱(指示MINME使用者代理如何顯示附加的檔案,開啟或下載,及檔名稱) metadata.setContentDisposition("filename/filesize=" + fileName + "/" + fileSize + "Byte."); // 上傳檔案 (上傳檔案流的形式) PutObjectResult putResult = ossClient.putObject(bucketName, folder + fileName, is, metadata); // 解析結果 resultStr = putResult.getETag(); } catch (Exception e) { e.printStackTrace(); logger.error("上傳阿里雲OSS伺服器異常." + e.getMessage(), e); } return resultStr; } /** * 通過檔名判斷並獲取OSS服務檔案上傳時檔案的contentType * * @param fileName 檔名 * @return 檔案的contentType */ public static String getContentType(String fileName) { // 檔案的字尾名 String fileExtension = fileName.substring(fileName.lastIndexOf(".")); if (".bmp".equalsIgnoreCase(fileExtension)) { return "image/bmp"; } if (".gif".equalsIgnoreCase(fileExtension)) { return "image/gif"; } if (".jpeg".equalsIgnoreCase(fileExtension) || ".jpg".equalsIgnoreCase(fileExtension) || ".png".equalsIgnoreCase(fileExtension)) { return "image/jpeg"; } if (".png".equalsIgnoreCase(fileExtension)) { return "image/png"; } if (".html".equalsIgnoreCase(fileExtension)) { return "text/html"; } if (".txt".equalsIgnoreCase(fileExtension)) { return "text/plain"; } if (".vsd".equalsIgnoreCase(fileExtension)) { return "application/vnd.visio"; } if (".ppt".equalsIgnoreCase(fileExtension) || "pptx".equalsIgnoreCase(fileExtension)) { return "application/vnd.ms-powerpoint"; } if (".doc".equalsIgnoreCase(fileExtension) || "docx".equalsIgnoreCase(fileExtension)) { return "application/msword"; } if (".xml".equalsIgnoreCase(fileExtension)) { return "text/xml"; } // 預設返回型別 return ""; } @Value("${aliyun.oss.accessKeyId}") public void setAccessKeyId(String accessKeyId) { OSSClientUtil.accessKeyId = accessKeyId; } @Value("${aliyun.oss.accessKeySecret}") public void setAccessKeySecret(String accessKeySecret) { OSSClientUtil.accessKeySecret = accessKeySecret; } @Value("${aliyun.oss.endpoint}") public void setEndpoint(String endpoint) { OSSClientUtil.endpoint = endpoint; } @Value("${aliyun.oss.bucketName}") public void setBucketName(String bucketName) { OSSClientUtil.bucketName = bucketName; } @Value("${aliyun.oss.folder}") public void setFolder(String folder) { OSSClientUtil.folder = folder; } }


ps:網上有的資料裡配置檔案中的key設定的為下面這個樣子:

# Aliyun Config
aliyun.accessKeyId=
aliyun.accessKeySecret=


# Aliyun OSS Config
aliyun.oss.endpoint=
aliyun.oss.bucketName=
aliyun.oss.folder=""


按照這樣方式,在讀取配置檔案中的value值時,key和secret都為" " 空字串。如果把aliyun.accessKeyId和aliyun.accessKeySecret寫成其他的key,都可以讀取到值。具體原因不太清楚為什麼。如果您知道,歡迎留言。


使用工具類上傳檔案:

 OSSClient ossclient = OSSClientUtil.getOSSClient();
  
  //提供相應型別的引數    
 OSSClientUtil.uploadObject2OSS(ossclient, toFile, OSSClientUtil.bucketName, inputPosition);