1. 程式人生 > >阿里雲OSS工具類

阿里雲OSS工具類

【前言】

       我們上家公司的儲存系統用的是FastDFS(智慧一代雲平臺(二十八):對前後端分離和FastDFS的使用的再理解);現在在職的公司用的是阿里雲的OSS(OSS的官方文件),在工作的時候整理一個上傳OSS檔案的工具類,現在與大家分享一下。

【工具類】

       1、工具類的程式碼:


   
  1. package zhanghan.oss.utils;
  2. import com.aliyun.oss.ClientException;
  3. import com.aliyun.oss.OSSClient;
  4. import com.aliyun.oss.OSSException;
  5. import
    com.aliyun.oss.model.ObjectMetadata;
  6. import com.aliyun.oss.model.PutObjectResult;
  7. import com.fasterxml.jackson.annotation.JsonValue;
  8. import
    org.apache.commons.io.FilenameUtils;
  9. import org.apache.commons.lang3.time.DateUtils;
  10. import org.springframework.util.StringUtils;
  11. import org.springframework.web.multipart.MultipartFile;
  12. import zhanghan.oss.exception.OSSCreateBucketRuntimeException;
  13. import zhanghan.oss.exception.OSSGeneratePresignedUrlRuntimeException;
  14. import zhanghan.oss.exception.OssPutObjectRuntimeException;
  15. import java.io.InputStream;
  16. import java.net.URL;
  17. import java.util.Date;
  18. import java.util.UUID;
  19. /**
  20. * OSS上傳工具類-張晗-2017/10/10
  21. */
  22. public class OSSUtil {
  23. private volatile static OSSClient instance;
  24. private OSSUtil() {
  25. }
  26. /**
  27. * 單例
  28. * @return OSS工具類例項
  29. */
  30. private static OSSClient getOSSClient() {
  31. if (instance == null) {
  32. synchronized (OSSUtil.class) {
  33. if (instance == null) {
  34. instance = new OSSClient(OSS_END_POINT, OSS_ACCESS_KEY_ID, OSS_ACCESS_KEY_SECRET);
  35. }
  36. }
  37. }
  38. return instance;
  39. }
  40. //定義日誌
  41. private final static LogUtils logger = LogUtils.getLogger(OSSUtil.class);
  42. //OSS 的地址
  43. private final static String OSS_END_POINT = "http://oss-cn-qingdao.aliyuncs.com";
  44. //OSS 的key值
  45. private final static String OSS_ACCESS_KEY_ID = "OSSKEY";
  46. //OSS 的secret值
  47. private final static String OSS_ACCESS_KEY_SECRET = "OSSSECRET";
  48. //OSS 的bucket名字
  49. private final static String OSS_BUCKET_NAME = "zhanghan-test";
  50. //設定URL過期時間為10年
  51. private final static Date OSS_URL_EXPIRATION = DateUtils.addDays( new Date(), 365 * 10);
  52. //檔案路徑的列舉
  53. public enum FileDirType {
  54. ZHANGHAN_TEST( "test");
  55. private String dir;
  56. FileDirType(String dir) {
  57. this.dir = dir;
  58. }
  59. @JsonValue
  60. public String getDir() {
  61. return dir;
  62. }
  63. }
  64. /**
  65. * 上傳檔案---去除URL中的?後的時間戳
  66. * @param file 檔案
  67. * @param fileDir 上傳到OSS上檔案的路徑
  68. * @return 檔案的訪問地址
  69. */
  70. public static String upload(MultipartFile file, FileDirType fileDir) {
  71. OSSUtil.createBucket();
  72. String fileName = OSSUtil.uploadFile(file, fileDir);
  73. String fileOssURL = OSSUtil.getImgUrl(fileName, fileDir);
  74. int firstChar = fileOssURL.indexOf( "?");
  75. if (firstChar > 0) {
  76. fileOssURL = fileOssURL.substring( 0, firstChar);
  77. }
  78. return fileOssURL;
  79. }
  80. /**
  81. * 當Bucket不存在時建立Bucket
  82. *
  83. * @throws OSSException 異常
  84. * @throws ClientException Bucket命名規則:
  85. * 1.只能包含小寫字母、數字和短橫線,
  86. * 2.必須以小寫字母和數字開頭和結尾
  87. * 3.長度在3-63之間
  88. */
  89. private static void createBucket() {
  90. try {
  91. if (!OSSUtil.getOSSClient().doesBucketExist(OSS_BUCKET_NAME)) { //判斷是否存在該Bucket,不存在時再重新建立
  92. OSSUtil.getOSSClient().createBucket(OSS_BUCKET_NAME);
  93. }
  94. } catch (Exception e) {
  95. logger.error( "{}", "建立Bucket失敗,請核對Bucket名稱(規則:只能包含小寫字母、數字和短橫線,必須以小寫字母和數字開頭和結尾,長度在3-63之間)");
  96. throw new OSSCreateBucketRuntimeException( "建立Bucket失敗,請核對Bucket名稱(規則:只能包含小寫字母、數字和短橫線,必須以小寫字母和數字開頭和結尾,長度在3-63之間)");
  97. }
  98. }
  99. /**
  100. * 上傳到OSS伺服器 如果同名檔案會覆蓋伺服器上的
  101. * @param file 檔案
  102. * @param fileDir 上傳到OSS上檔案的路徑
  103. * @return 檔案的訪問地址
  104. */
  105. private static String uploadFile(MultipartFile file, FileDirType fileDir) {
  106. String fileName = String.format(
  107. "%s.%s",
  108. UUID.randomUUID().toString(),
  109. FilenameUtils.getExtension(file.getOriginalFilename()));
  110. try (InputStream inputStream = file.getInputStream()) {
  111. //建立上傳Object的Metadata
  112. ObjectMetadata objectMetadata = new ObjectMetadata();
  113. objectMetadata.setContentLength(inputStream.available());
  114. objectMetadata.setCacheControl( "no-cache");
  115. objectMetadata.setHeader( "Pragma", "no-cache");
  116. objectMetadata.setContentType(getContentType(FilenameUtils.getExtension( "." + file.getOriginalFilename())));
  117. objectMetadata.setContentDisposition( "inline;filename=" + fileName);
  118. //上傳檔案
  119. PutObjectResult putResult = OSSUtil.getOSSClient().putObject(OSS_BUCKET_NAME, fileDir.getDir() + fileName, inputStream, objectMetadata);
  120. return fileName;
  121. } catch (Exception e) {
  122. logger.error( "{}", "上傳檔案失敗");
  123. throw new OssPutObjectRuntimeException( "上傳檔案失敗");
  124. }
  125. }
  126. /**
  127. * 獲得檔案路徑
  128. * @param fileUrl 檔案的URL
  129. * @param fileDir 檔案在OSS上的路徑
  130. * @return 檔案的路徑
  131. */
  132. private static String getImgUrl(String fileUrl, FileDirType fileDir) {
  133. if (StringUtils.isEmpty(fileUrl)) {
  134. logger.error( "{}", "檔案地址為空");
  135. throw new RuntimeException( "檔案地址為空");
  136. }
  137. String[] split = fileUrl.split( "/");
  138. //獲取oss圖片URL失敗
  139. URL url = OSSUtil.getOSSClient().generatePresignedUrl(OSS_BUCKET_NAME, fileDir.getDir() + split[split.length - 1], OSS_URL_EXPIRATION);
  140. if (url == null) {
  141. logger.error( "{}", "獲取oss檔案URL失敗");
  142. throw new OSSGeneratePresignedUrlRuntimeException( "獲取oss檔案URL失敗");
  143. }
  144. return url.toString();
  145. }
  146. /**
  147. * 判斷OSS服務檔案上傳時檔案的contentType
  148. *
  149. * @param FilenameExtension 檔案字尾
  150. * @return 字尾
  151. */
  152. private static String getContentType(String FilenameExtension) {
  153. if (FilenameExtension.equalsIgnoreCase( "bmp")) {
  154. return "image/bmp";
  155. }
  156. if (FilenameExtension.equalsIgnoreCase( "gif")) {
  157. return "image/gif";
  158. }
  159. if (FilenameExtension.equalsIgnoreCase( "jpeg") ||
  160. FilenameExtension.equalsIgnoreCase( "jpg") ||
  161. FilenameExtension.equalsIgnoreCase( "png")) {
  162. return "image/jpeg";
  163. }
  164. if (FilenameExtension.equalsIgnoreCase( "html")) {
  165. return "text/html";
  166. }
  167. if (FilenameExtension.equalsIgnoreCase( "txt")) {
  168. return "text/plain";
  169. }
  170. if (FilenameExtension.equalsIgnoreCase( "vsd")) {
  171. return "application/vnd.visio";
  172. }
  173. if (FilenameExtension.equalsIgnoreCase( "pptx") ||
  174. FilenameExtension.equalsIgnoreCase( "ppt")) {
  175. return "application/vnd.ms-powerpoint";
  176. }
  177. if (FilenameExtension.equalsIgnoreCase( "docx") ||
  178. FilenameExtension.equalsIgnoreCase( "doc")) {
  179. return "application/msword";
  180. }
  181. if (FilenameExtension.equalsIgnoreCase( "xml")) {
  182. return "text/xml";
  183. }
  184. return "image/jpeg";
  185. }
  186. }

       2、呼叫工具類的程式碼:


   
  1. /**
  2. * 上傳檔案測試
  3. * @param multipartFile 待上傳的檔案
  4. 相關推薦

    阿里OSS工具

    【前言】        我們上家公司的儲存系統用的是FastDFS(智慧一代雲平臺(二十八):對前後端分離和FastDFS的使用的再理解);現在在職的公司用的是阿里雲的OSS(OSS的官方文件),在工作的時候整理一個上傳OSS檔案的工具類,現在與大家分享一下。

    阿裏OSS工具

    src lsi uuid csdn pack sso wrong ews 商業模式 【前言】 我們上家公司的存儲系統用的是FastDFS(智能一代雲平臺(二十八):對前後端分離和FastDFS的使用的再理解);現在在職的公司

    阿里OSS上傳檔案工具

    /**    *  *  *  阿里雲OSS上傳檔案工具 *   *  支援普通檔案上傳,限制大小檔案上傳,限制大小圖片上傳 *    *   @version1.0 */public class AliyunOssUtil {private Logger logger =

    一個小工具,利用php把指定目錄檔案遞迴上傳到阿里OSS

    cp2oss(_GALLERY_DIR); function cp2oss($directory) { $mydir = dir($directory); while($file = $mydir->read()) { if(is_dir("$

    一招教你寫部落格,Typora+PicGo+阿里oss,最好用的Markdown+最好用的圖床工具

    ### 部落格 > ### 寫部落格的好處 **1.使自己變得更善於觀察**。一旦你養成了記部落格的習慣,與此同時你也賦予了一個更好的機會給自己,讓自己去更細緻地觀察生活。一個人的生活經歷本就是價值連城的,從中學習到的知識,教訓更是異常珍貴。放眼生活中那些正面的、負面的資訊,讓自己靜靜地去思考,

    SpringBoot整合阿里OSS儲存服務

    摘要:OSS可用於圖片、音視訊、日誌等海量檔案的儲存。各種終端裝置、Web網站程式、移動應用可以直接向OSS寫入或讀取資料,非常方便。本篇文章介紹如何在java的SpringBoot專案中,整個使用OSS服務,spring 專案也可以參考。 主要步驟如下: 前提是開通了阿里雲OSS服務,然後

    阿里OSS儲存開發

    OSSClient是與OSS服務互動的客戶端,SDK的OSS操作都是通過OSSClient完成的。 下面程式碼新建了一個OSSClient: using Aliyun.OpenServices.OpenStorageService; using System; using System.Co

    阿里oss js前端獲取簽名直傳檔案

    1. 原來的官方文件是先選擇檔案,再點選上傳按鈕,上傳檔案,我這裡是選擇完檔案,就上傳,這裡主要是在FilesAdded這個裡面新增完檔案,立刻初始化一次set_upload_param(uploader, '', true); 就能選擇完就上傳了. 2.這個只是個簡單的圖片上傳,沒有

    從群輝儲存裝置上傳圖片到阿里OSS方案

    一,需求 1,大量圖片需要做異地災備,大約有上百萬張圖片,而且還會往上增加,每張圖片大小在5M-10M左右; 2,環境說明:伺服器是群輝儲存,作業系統功能受限制,跟centos系統使用有諸多不同; 二,實施方案 1,設定crontab任務 #backup data to Al

    微信小程式 上傳圖片至阿里OSS(支援多圖片上傳)

    我們先講下為什麼要把圖片檔案上傳到雲伺服器呢, 有什麼好處呢? 1、能減輕我們自己伺服器的頻寬 如果一個程式裡有多處地方用到使用者上傳圖片等功能的話,建議還是放到阿里雲或者千牛雲等其他平臺上來儲存我們的圖片,可以給公司的伺服器減少很多壓力,磁碟儲存也就不會太大 2、提升使用者體驗感

    php/PHP 阿里OSS檔案上傳

     一、封裝的upload方法能看懂就看 看不懂直接使用         1.支援base64和普通表單等檔案上傳方式(會自動判斷方式)         2.呼叫時候只需要傳入一個要上傳到阿

    tp框架 阿里oss 上傳 ,刪除,判斷是不是存在

    composer require aliyuncs/oss-sdk-php  配置檔案如下 'ALIOSS_CONFIG' => array( 'KEY_ID' => '', 'KEY_SECRET' => '',

    SpringBoot + 阿里OSS檔案上傳服務

    分享一個關於檔案上傳服務的專案 pom.xml檔案需要新增的依賴 <dependency> <groupId>com.aliyun.oss</groupId> <artifactId>aliy

    阿里OSS上儲存了什麼東西?

    阿里雲物件儲存服務(Object Storage Service,簡稱OSS)為您提供基於網路的資料存取服務。使用OSS,您可以通過網路隨時儲存和呼叫包括文字、圖片、音訊和視訊等在內的各種非結構化資料檔案。 阿里雲OSS將資料檔案以物件(object)的形式上傳到儲存空間(bucket)中。

    詳解wordpress如何把檔案儲存到阿里OSS上!

    自己搞了一個Wordpress的部落格,裝完之後一直晾著沒管,最近閒來開荒。為了減小伺服器的頻寬、儲存、CUP的壓力,決定把部落格中的所有檔案都儲存到阿里雲OSS上面。 關於這個問題,自己去呼叫OSS的SDK然後再去修改wordpress這種方式肯定是費時又費力,哪怕是你閒得蛋疼也不會這麼幹,何況是忙到蛋疼

    阿里 oss 檔案下載進度顯示

    思路是:第一獲取要下載檔案的大小,設為X,第二通過多執行緒監測已下載檔案的大小,設為Y,Y/x就是下載的進度。關鍵程式碼如下     //獲取要下載的object的metadata         ObjectMeta

    jFianl配置阿里OSS教程

    1、第一步購買什麼的就不說啦 2、建立Bucket,在自己選擇的節點上 3、在自己建立的Bucket下建立資料夾,oss這裡演示的是上傳圖片建立test資料夾作為演示 4、開始配置檔案,先在resource下建立一個oss配置檔案需要的引數endpoint、accessKeyId、se

    阿里OSS

    1.先將圖片上傳到uploads中,獲取圖片的savename 2.將圖片上傳到oss上,addossimg($ossPath, $path)第一個引數為oss存放圖片的路徑,第二個引數為本地的路徑 3.返回圖片的資訊 程式碼如下: 控制器中的方法為:     /*修改

    SpringBoot 整合 阿里OSS 儲存服務,快來免費搭建一個自己的圖床

    Github 地址:https://github.com/Snailclimb/springboot-integration-examples(SpringBoot和其他常用技術的整合,可能是你遇到的講解最詳細的學習案例,力爭新手也能看懂並且能夠在看完之後獨立實踐。基於最新的 S

    Java專案整合阿里OSS上傳圖片

    工具類: import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import org.slf4j.Lo