摘要:筆主很早就開始用阿里云存儲服務(wù)當(dāng)做自己的圖床了。阿里云對象存儲文檔,本篇文章會介紹到整合阿里云存儲服務(wù)實現(xiàn)文件上傳下載以及簡單的查看。
Github 地址:https://github.com/Snailclimb/springboot-integration-examples(SpringBoot和其他常用技術(shù)的整合,可能是你遇到的講解最詳細(xì)的學(xué)習(xí)案例,力爭新手也能看懂并且能夠在看完之后獨立實踐。基于最新的 SpringBoot2.0+,是你學(xué)習(xí)SpringBoot 的最佳指南。) ,歡迎各位 Star。
筆主很早就開始用阿里云OSS 存儲服務(wù)當(dāng)做自己的圖床了。如果沒有用過阿里云OSS 存儲服務(wù)或者不是很了解這個東西的可以看看官方文檔,我這里就不多做介紹了。阿里云對象存儲 OSS文檔,:
https://help.aliyun.com/product/31815.html?spm=a2c4g.11186623.6.540.4e401c62EyJK5T
本篇文章會介紹到 SpringBoot 整合阿里云OSS 存儲服務(wù)實現(xiàn)文件上傳下載以及簡單的查看。其實今天將的應(yīng)該算的上是一個簡單的小案例了,涉及到的知識點還算是比較多。
一 開發(fā)前的準(zhǔn)備 1.1 前置知識具有 Java 基礎(chǔ)以及SpringBoot 簡單基礎(chǔ)知識即可。
1.2 環(huán)境參數(shù)開發(fā)工具:IDEA
基礎(chǔ)工具:Maven+JDK8
所用技術(shù):SpringBoot+阿里云OSS 存儲服務(wù) Java 相關(guān)API
SpringBoot版本:2.1.0
1.3 你能學(xué)到什么SpringBoot 整合 阿里云OSS 存儲服務(wù)并編寫相關(guān)工具類
SpringBoot 整合 thymeleaf 并實現(xiàn)前后端傳值
SpringBoot 從配置文件讀取值并注入到類中
如何自己搭建一個圖床使用(通過前端選擇圖片,支持預(yù)覽,但不支持修改圖片)
1.4 創(chuàng)建工程創(chuàng)建一個基本的 SpringBoot 項目,我這里就不多說這方面問題了,具體可以參考下面這篇文章:
https://blog.csdn.net/qq_3433...
1.5 項目結(jié)構(gòu) 1.6 配置 pom 文件中的相關(guān)依賴二 配置阿里云 OSS 存儲相關(guān)屬性org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-test test org.springframework.boot spring-boot-starter-thymeleaf com.aliyun.oss aliyun-sdk-oss 2.4.0 commons-fileupload commons-fileupload 1.3.1 org.springframework.boot spring-boot-configuration-processor true
我在項目中使用的通過常量類來配置,不過你也可以使用 .properties 配置文件來配置,然后@ConfigurationProperties 注解注入到類中。
2.1 通過常量類配置(本項目使用的方式)AliyunOSSConfigConstant.java
/** * @Auther: SnailClimb * @Date: 2018/12/4 15:09 * @Description: 阿里云OSS存儲的相關(guān)常量配置.我這里通過常量類來配置的,當(dāng)然你也可以通過.properties 配置文件來配置, * 然后利用 SpringBoot 的@ConfigurationProperties 注解來注入 */ public class AliyunOSSConfigConstant { //私有構(gòu)造方法 禁止該類初始化 private AliyunOSSConfigConstant() { } //倉庫名稱 public static final String BUCKE_NAME = "my-blog-to-use"; //地域節(jié)點 public static final String END_POINT = "oss-cn-beijing.aliyuncs.com"; //AccessKey ID public static final String AccessKey_ID = "你的AccessKeyID"; //Access Key Secret public static final String AccessKey_Secret = "你的AccessKeySecret"; //倉庫中的某個文件夾 public static final String FILE_HOST = "test"; }
到阿里云 OSS 控制臺:https://oss.console.aliyun.com/overview獲取上述相關(guān)信息:
獲取 BUCKE_NAME 和 END_POINT:
獲取AccessKey ID和Access Key Secret第一步:
獲取AccessKey ID和Access Key Secret第二步:
2.2 通過.properties 配置#OSS配置 aliyun.oss.bucketname=my-blog-to-use aliyun.oss.endpoint=oss-cn-beijing.aliyuncs.com #阿里云主賬號AccessKey擁有所有API的訪問權(quán)限,風(fēng)險很高。建議創(chuàng)建并使用RAM賬號進(jìn)行API訪問或日常運維,請登錄 https://ram.console.aliyun.com 創(chuàng)建RAM賬號。 aliyun.oss.keyid=你的AccessKeyID aliyun.oss.keysecret=你的AccessKeySecret aliyun.oss.filehost=test
然后新建一個類將屬性注入:
@Component @PropertySource(value = "classpath:application-oss.properties") @ConfigurationProperties(prefix = "aliyun.oss") /** * 阿里云oss的配置類 */ public class AliyunOSSConfig { private String bucketname; private String endpoint; private String keyid; private String keysecret; private String filehost; ... 此處省略getter、setter以及 toString方法 }三 工具類相關(guān)方法編寫
該工具類主要提供了三個方法:上傳文件 upLoad(File file) 、通過文件名下載文件downloadFile(String objectName, String localFileName) 、列出某個文件夾下的所有文件listFile( )。筆主比較懶,代碼可能還比較簡陋,各位可以懂懂自己的腦子,參考阿里云官方提供的相關(guān)文檔來根據(jù)自己的需求來優(yōu)化。Java API文檔地址如下:
https://help.aliyun.com/document_detail/32008.html?spm=a2c4g.11186623.6.703.238374b4PsMzWf
/** * @Author: SnailClimb * @Date: 2018/12/1 16:56 * @Description: 阿里云OSS服務(wù)相關(guān)工具類. * Java API文檔地址:https://help.aliyun.com/document_detail/32008.html?spm=a2c4g.11186623.6.703.238374b4PsMzWf */ @Component public class AliyunOSSUtil { private static final org.slf4j.Logger logger = LoggerFactory.getLogger(AliyunOSSUtil.class); private static String FILE_URL; private static String bucketName = AliyunOSSConfigConstant.BUCKE_NAME; private static String endpoint = AliyunOSSConfigConstant.END_POINT; private static String accessKeyId = AliyunOSSConfigConstant.AccessKey_ID; private static String accessKeySecret = AliyunOSSConfigConstant.AccessKey_Secret; private static String fileHost = AliyunOSSConfigConstant.FILE_HOST; /** * 上傳文件。 * * @param file 需要上傳的文件路徑 * @return 如果上傳的文件是圖片的話,會返回圖片的"URL",如果非圖片的話會返回"非圖片,不可預(yù)覽。文件路徑為:+文件路徑" */ public static String upLoad(File file) { // 默認(rèn)值為:true boolean isImage = true; // 判斷所要上傳的圖片是否是圖片,圖片可以預(yù)覽,其他文件不提供通過URL預(yù)覽 try { Image image = ImageIO.read(file); isImage = image == null ? false : true; } catch (IOException e) { e.printStackTrace(); } logger.info("------OSS文件上傳開始--------" + file.getName()); SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); String dateStr = format.format(new Date()); // 判斷文件 if (file == null) { return null; } // 創(chuàng)建OSSClient實例。 OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret); try { // 判斷容器是否存在,不存在就創(chuàng)建 if (!ossClient.doesBucketExist(bucketName)) { ossClient.createBucket(bucketName); CreateBucketRequest createBucketRequest = new CreateBucketRequest(bucketName); createBucketRequest.setCannedACL(CannedAccessControlList.PublicRead); ossClient.createBucket(createBucketRequest); } // 設(shè)置文件路徑和名稱 String fileUrl = fileHost + "/" + (dateStr + "/" + UUID.randomUUID().toString().replace("-", "") + "-" + file.getName()); if (isImage) {//如果是圖片,則圖片的URL為:.... FILE_URL = "https://" + bucketName + "." + endpoint + "/" + fileUrl; } else { FILE_URL = "非圖片,不可預(yù)覽。文件路徑為:" + fileUrl; } // 上傳文件 PutObjectResult result = ossClient.putObject(new PutObjectRequest(bucketName, fileUrl, file)); // 設(shè)置權(quán)限(公開讀) ossClient.setBucketAcl(bucketName, CannedAccessControlList.PublicRead); if (result != null) { logger.info("------OSS文件上傳成功------" + fileUrl); } } catch (OSSException oe) { logger.error(oe.getMessage()); } catch (ClientException ce) { logger.error(ce.getErrorMessage()); } finally { if (ossClient != null) { ossClient.shutdown(); } } return FILE_URL; } /** * 通過文件名下載文件 * * @param objectName 要下載的文件名 * @param localFileName 本地要創(chuàng)建的文件名 */ public static void downloadFile(String objectName, String localFileName) { // 創(chuàng)建OSSClient實例。 OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret); // 下載OSS文件到本地文件。如果指定的本地文件存在會覆蓋,不存在則新建。 ossClient.getObject(new GetObjectRequest(bucketName, objectName), new File(localFileName)); // 關(guān)閉OSSClient。 ossClient.shutdown(); } /** * 列舉 test 文件下所有的文件 */ public static void listFile() { // 創(chuàng)建OSSClient實例。 OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret); // 構(gòu)造ListObjectsRequest請求。 ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName); // 設(shè)置prefix參數(shù)來獲取fun目錄下的所有文件。 listObjectsRequest.setPrefix("test/"); // 列出文件。 ObjectListing listing = ossClient.listObjects(listObjectsRequest); // 遍歷所有文件。 System.out.println("Objects:"); for (OSSObjectSummary objectSummary : listing.getObjectSummaries()) { System.out.println(objectSummary.getKey()); } // 遍歷所有commonPrefix。 System.out.println("CommonPrefixes:"); for (String commonPrefix : listing.getCommonPrefixes()) { System.out.println(commonPrefix); } // 關(guān)閉OSSClient。 ossClient.shutdown(); } }四 Controller 層編寫相關(guān)測試方法
上傳文件 upLoad(File file) 、通過文件名下載文件downloadFile(String objectName, String localFileName) 、列出某個文件夾下的所有文件listFile( ) 這三個方法都在下面有對應(yīng)的簡單測試。另外,還有一個方法 uploadPicture(@RequestParam("file") MultipartFile file, Model model)對應(yīng)于我們等下要實現(xiàn)的圖床功能,該方法從前端接受到圖片之后上傳到阿里云OSS存儲空間并返回上傳成功的圖片 URL 地址給前端。
注意將下面的相關(guān)路徑改成自己的,不然會報錯!!!
/** * @Author: SnailClimb * @Date: 2018/12/2 16:56 * @Description: 阿里云OSS服務(wù)Controller */ @Controller @RequestMapping("/oss") public class AliyunOSSController { private final org.slf4j.Logger logger = LoggerFactory.getLogger(getClass()); @Autowired private AliyunOSSUtil aliyunOSSUtil; /** * 測試上傳文件到阿里云OSS存儲 * * @return */ @RequestMapping("/testUpload") @ResponseBody public String testUpload() { File file = new File("E:/Picture/test.jpg"); AliyunOSSUtil aliyunOSSUtil = new AliyunOSSUtil(); String url = aliyunOSSUtil.upLoad(file); System.out.println(url); return "success"; } /** * 通過文件名下載文件 */ @RequestMapping("/testDownload") @ResponseBody public String testDownload() { AliyunOSSUtil aliyunOSSUtil = new AliyunOSSUtil(); aliyunOSSUtil.downloadFile( "test/2018-12-04/e3f892c27f07462a864a43b8187d4562-rawpixel-600782-unsplash.jpg","E:/Picture/e3f892c27f07462a864a43b8187d4562-rawpixel-600782-unsplash.jpg"); return "success"; } /** * 列出某個文件夾下的所有文件 */ @RequestMapping("/testListFile") @ResponseBody public String testListFile() { AliyunOSSUtil aliyunOSSUtil = new AliyunOSSUtil(); aliyunOSSUtil.listFile(); return "success"; } /** * 文件上傳(供前端調(diào)用) */ @RequestMapping(value = "/uploadFile") public String uploadPicture(@RequestParam("file") MultipartFile file, Model model) { logger.info("文件上傳"); String filename = file.getOriginalFilename(); System.out.println(filename); try { if (file != null) { if (!"".equals(filename.trim())) { File newFile = new File(filename); FileOutputStream os = new FileOutputStream(newFile); os.write(file.getBytes()); os.close(); file.transferTo(newFile); // 上傳到OSS String uploadUrl = aliyunOSSUtil.upLoad(newFile); model.addAttribute("url",uploadUrl); } } } catch (Exception ex) { ex.printStackTrace(); } return "success"; } }五 啟動類
@SpringBootApplication public class SpringbootOssApplication { public static void main(String[] args) { SpringApplication.run(SpringbootOssApplication.class, args); } }六 上傳圖片相關(guān)前端頁面
注意引入jquery ,避免前端出錯。
index.html
JS 的內(nèi)容主要是讓我們上傳的圖片可以預(yù)覽,就像我們在網(wǎng)站更換頭像的時候一樣。
基于阿里云OSS存儲的圖床
success.html
通過 引用后端傳過來的值。
七 測試我們的圖床上傳結(jié)果 上傳成功!
圖片地址為:
訪問 :http://localhost:8080/
① 上傳圖片
② 圖片上傳成功返回圖片地址
③ 通過圖片 URL 訪問圖片
我們終于能夠獨立利用阿里云 OSS 完成一個自己的圖床服務(wù),但是其實如果你想用阿里云OSS當(dāng)做圖床可以直接使用極簡圖床:http://jiantuku.com 上傳圖片,比較方便!大家可能心里在想那你特么讓我實現(xiàn)個圖床干嘛?我覺得通過學(xué)習(xí),大家以后可以做很多事情,比如 利用阿里云OSS 存儲服務(wù)存放自己網(wǎng)站的相關(guān)圖片。
ThoughtWorks準(zhǔn)入職Java工程師。專注Java知識分享!開源 Java 學(xué)習(xí)指南——JavaGuide(12k+ Star)的作者。公眾號多篇文章被各大技術(shù)社區(qū)轉(zhuǎn)載。公眾號后臺回復(fù)關(guān)鍵字“1”可以領(lǐng)取一份我精選的Java資源哦!
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/72582.html
摘要:接下來講解一下博客中用的圖床阿里云對象存儲,簡稱,雖然目前大家用的比較多的是七牛云之類的,但是因為我個人原因我還是選擇了阿里云,后面我會簡單說明下原因。 showImg(https://segmentfault.com/img/remote/1460000008838754?w=960&h=300); 前言 之前打算寫一篇有關(guān)個人博客SEO優(yōu)化的體驗和一些自身體會,但是發(fā)現(xiàn)自己還沒完全...
摘要:接下來講解一下博客中用的圖床阿里云對象存儲,簡稱,雖然目前大家用的比較多的是七牛云之類的,但是因為我個人原因我還是選擇了阿里云,后面我會簡單說明下原因。 showImg(https://segmentfault.com/img/remote/1460000008838754?w=960&h=300); 前言 之前打算寫一篇有關(guān)個人博客SEO優(yōu)化的體驗和一些自身體會,但是發(fā)現(xiàn)自己還沒完全...
摘要:本篇文章就來分享一下兩款開箱即用上手容易的圖床相冊程序和在線文件管理器目錄列表程序,由好友開發(fā)并維護,非常適合個人站長用作圖床相冊和文件下載分享。雖然說現(xiàn)在照片還有文件存儲等都可以上傳到網(wǎng)盤中,但是國內(nèi)的網(wǎng)盤與國外的網(wǎng)盤存儲還有點不一樣。以百度網(wǎng)盤與Dropbox對比為例,百度網(wǎng)盤頂多算是一個個人用來存放私人照片和文件的網(wǎng)絡(luò)硬盤,如果用來分享的話很容易被百度限制或者取消下載。很多的個人站長為...
閱讀 1074·2021-11-19 09:40
閱讀 2213·2021-11-15 18:00
閱讀 1267·2021-10-18 13:34
閱讀 2248·2021-09-02 15:40
閱讀 1533·2019-08-30 14:01
閱讀 1113·2019-08-30 11:11
閱讀 2482·2019-08-29 15:26
閱讀 722·2019-08-29 14:15