摘要:筆主很早就開始用阿里云存儲服務當做自己的圖床了。阿里云對象存儲文檔,本篇文章會介紹到整合阿里云存儲服務實現文件上傳下載以及簡單的查看。
Github 地址:https://github.com/Snailclimb/springboot-integration-examples(SpringBoot和其他常用技術的整合,可能是你遇到的講解最詳細的學習案例,力爭新手也能看懂并且能夠在看完之后獨立實踐。基于最新的 SpringBoot2.0+,是你學習SpringBoot 的最佳指南。) ,歡迎各位 Star。
筆主很早就開始用阿里云OSS 存儲服務當做自己的圖床了。如果沒有用過阿里云OSS 存儲服務或者不是很了解這個東西的可以看看官方文檔,我這里就不多做介紹了。阿里云對象存儲 OSS文檔,:
https://help.aliyun.com/product/31815.html?spm=a2c4g.11186623.6.540.4e401c62EyJK5T
本篇文章會介紹到 SpringBoot 整合阿里云OSS 存儲服務實現文件上傳下載以及簡單的查看。其實今天將的應該算的上是一個簡單的小案例了,涉及到的知識點還算是比較多。
一 開發前的準備 1.1 前置知識具有 Java 基礎以及SpringBoot 簡單基礎知識即可。
1.2 環境參數開發工具:IDEA
基礎工具:Maven+JDK8
所用技術:SpringBoot+阿里云OSS 存儲服務 Java 相關API
SpringBoot版本:2.1.0
1.3 你能學到什么SpringBoot 整合 阿里云OSS 存儲服務并編寫相關工具類
SpringBoot 整合 thymeleaf 并實現前后端傳值
SpringBoot 從配置文件讀取值并注入到類中
如何自己搭建一個圖床使用(通過前端選擇圖片,支持預覽,但不支持修改圖片)
1.4 創建工程創建一個基本的 SpringBoot 項目,我這里就不多說這方面問題了,具體可以參考下面這篇文章:
https://blog.csdn.net/qq_3433...
1.5 項目結構 1.6 配置 pom 文件中的相關依賴二 配置阿里云 OSS 存儲相關屬性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存儲的相關常量配置.我這里通過常量類來配置的,當然你也可以通過.properties 配置文件來配置,
* 然后利用 SpringBoot 的@ConfigurationProperties 注解來注入
*/
public class AliyunOSSConfigConstant {
//私有構造方法 禁止該類初始化
private AliyunOSSConfigConstant() {
}
//倉庫名稱
public static final String BUCKE_NAME = "my-blog-to-use";
//地域節點
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獲取上述相關信息:
獲取 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的訪問權限,風險很高。建議創建并使用RAM賬號進行API訪問或日常運維,請登錄 https://ram.console.aliyun.com 創建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方法
}
三 工具類相關方法編寫
該工具類主要提供了三個方法:上傳文件 upLoad(File file) 、通過文件名下載文件downloadFile(String objectName, String localFileName) 、列出某個文件夾下的所有文件listFile( )。筆主比較懶,代碼可能還比較簡陋,各位可以懂懂自己的腦子,參考阿里云官方提供的相關文檔來根據自己的需求來優化。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服務相關工具類.
* 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",如果非圖片的話會返回"非圖片,不可預覽。文件路徑為:+文件路徑"
*/
public static String upLoad(File file) {
// 默認值為:true
boolean isImage = true;
// 判斷所要上傳的圖片是否是圖片,圖片可以預覽,其他文件不提供通過URL預覽
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;
}
// 創建OSSClient實例。
OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
try {
// 判斷容器是否存在,不存在就創建
if (!ossClient.doesBucketExist(bucketName)) {
ossClient.createBucket(bucketName);
CreateBucketRequest createBucketRequest = new CreateBucketRequest(bucketName);
createBucketRequest.setCannedACL(CannedAccessControlList.PublicRead);
ossClient.createBucket(createBucketRequest);
}
// 設置文件路徑和名稱
String fileUrl = fileHost + "/" + (dateStr + "/" + UUID.randomUUID().toString().replace("-", "") + "-" + file.getName());
if (isImage) {//如果是圖片,則圖片的URL為:....
FILE_URL = "https://" + bucketName + "." + endpoint + "/" + fileUrl;
} else {
FILE_URL = "非圖片,不可預覽。文件路徑為:" + fileUrl;
}
// 上傳文件
PutObjectResult result = ossClient.putObject(new PutObjectRequest(bucketName, fileUrl, file));
// 設置權限(公開讀)
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 本地要創建的文件名
*/
public static void downloadFile(String objectName, String localFileName) {
// 創建OSSClient實例。
OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
// 下載OSS文件到本地文件。如果指定的本地文件存在會覆蓋,不存在則新建。
ossClient.getObject(new GetObjectRequest(bucketName, objectName), new File(localFileName));
// 關閉OSSClient。
ossClient.shutdown();
}
/**
* 列舉 test 文件下所有的文件
*/
public static void listFile() {
// 創建OSSClient實例。
OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
// 構造ListObjectsRequest請求。
ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName);
// 設置prefix參數來獲取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);
}
// 關閉OSSClient。
ossClient.shutdown();
}
}
四 Controller 層編寫相關測試方法
上傳文件 upLoad(File file) 、通過文件名下載文件downloadFile(String objectName, String localFileName) 、列出某個文件夾下的所有文件listFile( ) 這三個方法都在下面有對應的簡單測試。另外,還有一個方法 uploadPicture(@RequestParam("file") MultipartFile file, Model model)對應于我們等下要實現的圖床功能,該方法從前端接受到圖片之后上傳到阿里云OSS存儲空間并返回上傳成功的圖片 URL 地址給前端。
注意將下面的相關路徑改成自己的,不然會報錯!!!
/**
* @Author: SnailClimb
* @Date: 2018/12/2 16:56
* @Description: 阿里云OSS服務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";
}
/**
* 文件上傳(供前端調用)
*/
@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);
}
}
六 上傳圖片相關前端頁面
注意引入jquery ,避免前端出錯。
index.html
JS 的內容主要是讓我們上傳的圖片可以預覽,就像我們在網站更換頭像的時候一樣。
基于阿里云OSS存儲的圖床
success.html
通過 引用后端傳過來的值。
上傳結果
上傳成功!
圖片地址為:
七 測試我們的圖床
訪問 :http://localhost:8080/
① 上傳圖片
② 圖片上傳成功返回圖片地址
③ 通過圖片 URL 訪問圖片
我們終于能夠獨立利用阿里云 OSS 完成一個自己的圖床服務,但是其實如果你想用阿里云OSS當做圖床可以直接使用極簡圖床:http://jiantuku.com 上傳圖片,比較方便!大家可能心里在想那你特么讓我實現個圖床干嘛?我覺得通過學習,大家以后可以做很多事情,比如 利用阿里云OSS 存儲服務存放自己網站的相關圖片。
ThoughtWorks準入職Java工程師。專注Java知識分享!開源 Java 學習指南——JavaGuide(12k+ Star)的作者。公眾號多篇文章被各大技術社區轉載。公眾號后臺回復關鍵字“1”可以領取一份我精選的Java資源哦!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.hztianpu.com/yun/72582.html
摘要:接下來講解一下博客中用的圖床阿里云對象存儲,簡稱,雖然目前大家用的比較多的是七牛云之類的,但是因為我個人原因我還是選擇了阿里云,后面我會簡單說明下原因。 showImg(https://segmentfault.com/img/remote/1460000008838754?w=960&h=300); 前言 之前打算寫一篇有關個人博客SEO優化的體驗和一些自身體會,但是發現自己還沒完全...
摘要:接下來講解一下博客中用的圖床阿里云對象存儲,簡稱,雖然目前大家用的比較多的是七牛云之類的,但是因為我個人原因我還是選擇了阿里云,后面我會簡單說明下原因。 showImg(https://segmentfault.com/img/remote/1460000008838754?w=960&h=300); 前言 之前打算寫一篇有關個人博客SEO優化的體驗和一些自身體會,但是發現自己還沒完全...
摘要:本篇文章就來分享一下兩款開箱即用上手容易的圖床相冊程序和在線文件管理器目錄列表程序,由好友開發并維護,非常適合個人站長用作圖床相冊和文件下載分享。雖然說現在照片還有文件存儲等都可以上傳到網盤中,但是國內的網盤與國外的網盤存儲還有點不一樣。以百度網盤與Dropbox對比為例,百度網盤頂多算是一個個人用來存放私人照片和文件的網絡硬盤,如果用來分享的話很容易被百度限制或者取消下載。很多的個人站長為...
閱讀 1279·2021-11-19 09:40
閱讀 2475·2021-11-15 18:00
閱讀 1513·2021-10-18 13:34
閱讀 2507·2021-09-02 15:40
閱讀 1744·2019-08-30 14:01
閱讀 1352·2019-08-30 11:11
閱讀 2668·2019-08-29 15:26
閱讀 999·2019-08-29 14:15