摘要:筆主很早就開始用阿里云存儲(chǔ)服務(wù)當(dāng)做自己的圖床了。阿里云對(duì)象存儲(chǔ)文檔,本篇文章會(huì)介紹到整合阿里云存儲(chǔ)服務(wù)實(shí)現(xiàn)文件上傳下載以及簡(jiǎn)單的查看。
Github 地址:https://github.com/Snailclimb/springboot-integration-examples(SpringBoot和其他常用技術(shù)的整合,可能是你遇到的講解最詳細(xì)的學(xué)習(xí)案例,力爭(zhēng)新手也能看懂并且能夠在看完之后獨(dú)立實(shí)踐?;谧钚碌?SpringBoot2.0+,是你學(xué)習(xí)SpringBoot 的最佳指南。) ,歡迎各位 Star。
筆主很早就開始用阿里云OSS 存儲(chǔ)服務(wù)當(dāng)做自己的圖床了。如果沒有用過(guò)阿里云OSS 存儲(chǔ)服務(wù)或者不是很了解這個(gè)東西的可以看看官方文檔,我這里就不多做介紹了。阿里云對(duì)象存儲(chǔ) OSS文檔,:
https://help.aliyun.com/product/31815.html?spm=a2c4g.11186623.6.540.4e401c62EyJK5T
本篇文章會(huì)介紹到 SpringBoot 整合阿里云OSS 存儲(chǔ)服務(wù)實(shí)現(xiàn)文件上傳下載以及簡(jiǎn)單的查看。其實(shí)今天將的應(yīng)該算的上是一個(gè)簡(jiǎn)單的小案例了,涉及到的知識(shí)點(diǎn)還算是比較多。
一 開發(fā)前的準(zhǔn)備 1.1 前置知識(shí)具有 Java 基礎(chǔ)以及SpringBoot 簡(jiǎn)單基礎(chǔ)知識(shí)即可。
1.2 環(huán)境參數(shù)開發(fā)工具:IDEA
基礎(chǔ)工具:Maven+JDK8
所用技術(shù):SpringBoot+阿里云OSS 存儲(chǔ)服務(wù) Java 相關(guān)API
SpringBoot版本:2.1.0
1.3 你能學(xué)到什么SpringBoot 整合 阿里云OSS 存儲(chǔ)服務(wù)并編寫相關(guān)工具類
SpringBoot 整合 thymeleaf 并實(shí)現(xiàn)前后端傳值
SpringBoot 從配置文件讀取值并注入到類中
如何自己搭建一個(gè)圖床使用(通過(guò)前端選擇圖片,支持預(yù)覽,但不支持修改圖片)
1.4 創(chuàng)建工程創(chuàng)建一個(gè)基本的 SpringBoot 項(xiàng)目,我這里就不多說(shuō)這方面問(wèn)題了,具體可以參考下面這篇文章:
https://blog.csdn.net/qq_3433...
1.5 項(xiàng)目結(jié)構(gòu) 1.6 配置 pom 文件中的相關(guān)依賴二 配置阿里云 OSS 存儲(chǔ)相關(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
我在項(xiàng)目中使用的通過(guò)常量類來(lái)配置,不過(guò)你也可以使用 .properties 配置文件來(lái)配置,然后@ConfigurationProperties 注解注入到類中。
2.1 通過(guò)常量類配置(本項(xiàng)目使用的方式)AliyunOSSConfigConstant.java
/** * @Auther: SnailClimb * @Date: 2018/12/4 15:09 * @Description: 阿里云OSS存儲(chǔ)的相關(guān)常量配置.我這里通過(guò)常量類來(lái)配置的,當(dāng)然你也可以通過(guò).properties 配置文件來(lái)配置, * 然后利用 SpringBoot 的@ConfigurationProperties 注解來(lái)注入 */ public class AliyunOSSConfigConstant { //私有構(gòu)造方法 禁止該類初始化 private AliyunOSSConfigConstant() { } //倉(cāng)庫(kù)名稱 public static final String BUCKE_NAME = "my-blog-to-use"; //地域節(jié)點(diǎn) 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"; //倉(cāng)庫(kù)中的某個(gè)文件夾 public static final String FILE_HOST = "test"; }
到阿里云 OSS 控制臺(tái):https://oss.console.aliyun.com/overview獲取上述相關(guān)信息:
獲取 BUCKE_NAME 和 END_POINT:
獲取AccessKey ID和Access Key Secret第一步:
獲取AccessKey ID和Access Key Secret第二步:
2.2 通過(guò).properties 配置#OSS配置 aliyun.oss.bucketname=my-blog-to-use aliyun.oss.endpoint=oss-cn-beijing.aliyuncs.com #阿里云主賬號(hào)AccessKey擁有所有API的訪問(wèn)權(quán)限,風(fēng)險(xiǎn)很高。建議創(chuàng)建并使用RAM賬號(hào)進(jìn)行API訪問(wèn)或日常運(yùn)維,請(qǐng)登錄 https://ram.console.aliyun.com 創(chuàng)建RAM賬號(hào)。 aliyun.oss.keyid=你的AccessKeyID aliyun.oss.keysecret=你的AccessKeySecret aliyun.oss.filehost=test
然后新建一個(gè)類將屬性注入:
@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)方法編寫
該工具類主要提供了三個(gè)方法:上傳文件 upLoad(File file) 、通過(guò)文件名下載文件downloadFile(String objectName, String localFileName) 、列出某個(gè)文件夾下的所有文件listFile( )。筆主比較懶,代碼可能還比較簡(jiǎn)陋,各位可以懂懂自己的腦子,參考阿里云官方提供的相關(guān)文檔來(lái)根據(jù)自己的需求來(lái)優(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 如果上傳的文件是圖片的話,會(huì)返回圖片的"URL",如果非圖片的話會(huì)返回"非圖片,不可預(yù)覽。文件路徑為:+文件路徑" */ public static String upLoad(File file) { // 默認(rèn)值為:true boolean isImage = true; // 判斷所要上傳的圖片是否是圖片,圖片可以預(yù)覽,其他文件不提供通過(guò)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實(shí)例。 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; } /** * 通過(guò)文件名下載文件 * * @param objectName 要下載的文件名 * @param localFileName 本地要?jiǎng)?chuàng)建的文件名 */ public static void downloadFile(String objectName, String localFileName) { // 創(chuàng)建OSSClient實(shí)例。 OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret); // 下載OSS文件到本地文件。如果指定的本地文件存在會(huì)覆蓋,不存在則新建。 ossClient.getObject(new GetObjectRequest(bucketName, objectName), new File(localFileName)); // 關(guān)閉OSSClient。 ossClient.shutdown(); } /** * 列舉 test 文件下所有的文件 */ public static void listFile() { // 創(chuàng)建OSSClient實(shí)例。 OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret); // 構(gòu)造ListObjectsRequest請(qǐng)求。 ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName); // 設(shè)置prefix參數(shù)來(lái)獲取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)測(cè)試方法
上傳文件 upLoad(File file) 、通過(guò)文件名下載文件downloadFile(String objectName, String localFileName) 、列出某個(gè)文件夾下的所有文件listFile( ) 這三個(gè)方法都在下面有對(duì)應(yīng)的簡(jiǎn)單測(cè)試。另外,還有一個(gè)方法 uploadPicture(@RequestParam("file") MultipartFile file, Model model)對(duì)應(yīng)于我們等下要實(shí)現(xiàn)的圖床功能,該方法從前端接受到圖片之后上傳到阿里云OSS存儲(chǔ)空間并返回上傳成功的圖片 URL 地址給前端。
注意將下面的相關(guān)路徑改成自己的,不然會(huì)報(bào)錯(cuò)?。?!
/** * @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; /** * 測(cè)試上傳文件到阿里云OSS存儲(chǔ) * * @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"; } /** * 通過(guò)文件名下載文件 */ @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"; } /** * 列出某個(gè)文件夾下的所有文件 */ @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"; } }五 啟動(dòng)類
@SpringBootApplication public class SpringbootOssApplication { public static void main(String[] args) { SpringApplication.run(SpringbootOssApplication.class, args); } }六 上傳圖片相關(guān)前端頁(yè)面
注意引入jquery ,避免前端出錯(cuò)。
index.html
JS 的內(nèi)容主要是讓我們上傳的圖片可以預(yù)覽,就像我們?cè)诰W(wǎng)站更換頭像的時(shí)候一樣。
基于阿里云OSS存儲(chǔ)的圖床
success.html
通過(guò) 引用后端傳過(guò)來(lái)的值。
七 測(cè)試我們的圖床上傳結(jié)果 上傳成功!
圖片地址為:
訪問(wèn) :http://localhost:8080/
① 上傳圖片
② 圖片上傳成功返回圖片地址
③ 通過(guò)圖片 URL 訪問(wèn)圖片
我們終于能夠獨(dú)立利用阿里云 OSS 完成一個(gè)自己的圖床服務(wù),但是其實(shí)如果你想用阿里云OSS當(dāng)做圖床可以直接使用極簡(jiǎn)圖床:http://jiantuku.com 上傳圖片,比較方便!大家可能心里在想那你特么讓我實(shí)現(xiàn)個(gè)圖床干嘛?我覺得通過(guò)學(xué)習(xí),大家以后可以做很多事情,比如 利用阿里云OSS 存儲(chǔ)服務(wù)存放自己網(wǎng)站的相關(guān)圖片。
ThoughtWorks準(zhǔn)入職Java工程師。專注Java知識(shí)分享!開源 Java 學(xué)習(xí)指南——JavaGuide(12k+ Star)的作者。公眾號(hào)多篇文章被各大技術(shù)社區(qū)轉(zhuǎn)載。公眾號(hào)后臺(tái)回復(fù)關(guān)鍵字“1”可以領(lǐng)取一份我精選的Java資源哦!
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/72582.html
摘要:接下來(lái)講解一下博客中用的圖床阿里云對(duì)象存儲(chǔ),簡(jiǎn)稱,雖然目前大家用的比較多的是七牛云之類的,但是因?yàn)槲覀€(gè)人原因我還是選擇了阿里云,后面我會(huì)簡(jiǎn)單說(shuō)明下原因。 showImg(https://segmentfault.com/img/remote/1460000008838754?w=960&h=300); 前言 之前打算寫一篇有關(guān)個(gè)人博客SEO優(yōu)化的體驗(yàn)和一些自身體會(huì),但是發(fā)現(xiàn)自己還沒完全...
摘要:接下來(lái)講解一下博客中用的圖床阿里云對(duì)象存儲(chǔ),簡(jiǎn)稱,雖然目前大家用的比較多的是七牛云之類的,但是因?yàn)槲覀€(gè)人原因我還是選擇了阿里云,后面我會(huì)簡(jiǎn)單說(shuō)明下原因。 showImg(https://segmentfault.com/img/remote/1460000008838754?w=960&h=300); 前言 之前打算寫一篇有關(guān)個(gè)人博客SEO優(yōu)化的體驗(yàn)和一些自身體會(huì),但是發(fā)現(xiàn)自己還沒完全...
摘要:本篇文章就來(lái)分享一下兩款開箱即用上手容易的圖床相冊(cè)程序和在線文件管理器目錄列表程序,由好友開發(fā)并維護(hù),非常適合個(gè)人站長(zhǎng)用作圖床相冊(cè)和文件下載分享。雖然說(shuō)現(xiàn)在照片還有文件存儲(chǔ)等都可以上傳到網(wǎng)盤中,但是國(guó)內(nèi)的網(wǎng)盤與國(guó)外的網(wǎng)盤存儲(chǔ)還有點(diǎn)不一樣。以百度網(wǎng)盤與Dropbox對(duì)比為例,百度網(wǎng)盤頂多算是一個(gè)個(gè)人用來(lái)存放私人照片和文件的網(wǎng)絡(luò)硬盤,如果用來(lái)分享的話很容易被百度限制或者取消下載。很多的個(gè)人站長(zhǎng)為...
閱讀 1109·2021-11-19 09:40
閱讀 2251·2021-11-15 18:00
閱讀 1302·2021-10-18 13:34
閱讀 2280·2021-09-02 15:40
閱讀 1567·2019-08-30 14:01
閱讀 1141·2019-08-30 11:11
閱讀 2505·2019-08-29 15:26
閱讀 753·2019-08-29 14:15