Github 地址:github.com/Snailclimb/…(SpringBoot和其餘經常使用技術的整合,多是你遇到的講解最詳細的學習案例,力爭新手也能看懂而且可以在看完以後獨立實踐。基於最新的 SpringBoot2.0+,是你學習SpringBoot 的最佳指南。) ,歡迎各位 Star。javascript
筆主很早就開始用阿里雲OSS 存儲服務當作本身的圖牀了。若是沒有用過阿里雲OSS 存儲服務或者不是很瞭解這個東西的能夠看看官方文檔,我這裏就很少作介紹了。阿里雲對象存儲 OSS文檔,:html
help.aliyun.com/product/318…前端
本篇文章會介紹到 SpringBoot 整合阿里雲OSS 存儲服務實現文件上傳下載以及簡單的查看。其實今天將的應該算的上是一個簡單的小案例了,涉及到的知識點還算是比較多。java
具備 Java 基礎以及SpringBoot 簡單基礎知識便可。jquery
建立一個基本的 SpringBoot 項目,我這裏就很少說這方面問題了,具體能夠參考下面這篇文章:git
blog.csdn.net/qq_34337272…github
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- Thymeleaf-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!-- 阿里雲OSS-->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>2.4.0</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
複製代碼
我在項目中使用的經過常量類來配置,不過你也可使用 .properties 配置文件來配置,而後@ConfigurationProperties
註解注入到類中。web
AliyunOSSConfigConstant.javaspring
/** * @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 控制檯:oss.console.aliyun.com/overview獲取上述相關信息:後端
獲取 BUCKE_NAME 和 END_POINT:
獲取AccessKey ID和Access Key Secret第一步:
獲取AccessKey ID和Access Key Secret第二步:
#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文檔地址以下:
/** * @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();
}
}
複製代碼
上傳文件 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 的內容主要是讓咱們上傳的圖片能夠預覽,就像咱們在網站更換頭像的時候同樣。
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>基於阿里雲OSS存儲的圖牀</title>
<script th:src="@{/js/jquery-3.3.1.js}"></script>
<style>
* {
margin: 0;
padding: 0;
}
#submit {
margin-left: 15px;
}
.preview_box img {
width: 200px;
}
</style>
</head>
<body>
<form action="/oss/uploadFile" enctype="multipart/form-data" method="post">
<div class="form-group" id="group">
<input type="file" id="img_input" name="file" accept="image/*">
<label for="img_input" ></label>
</div>
<button type="submit" id="submit">上傳</button>
<!--預覽圖片-->
<div class="preview_box"></div>
</form>
<script type="text/javascript">
$("#img_input").on("change", function (e) {
var file = e.target.files[0]; //獲取圖片資源
// 只選擇圖片文件
if (!file.type.match('image.*')) {
return false;
}
var reader = new FileReader();
reader.readAsDataURL(file); // 讀取文件
// 渲染文件
reader.onload = function (arg) {
var img = '<img class="preview" src="' + arg.target.result + '" alt="preview"/>';
$(".preview_box").empty().append(img);
}
});
</script>
</body>
</html>
複製代碼
success.html
經過 <span th:text="${url}"></span>
引用後端傳過來的值。
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>上傳結果</title>
</head>
<body>
<h1>上傳成功!</h1>
圖片地址爲:<span th:text="${url}"></span>
</body>
</html>
複製代碼
① 上傳圖片
② 圖片上傳成功返回圖片地址
③ 經過圖片 URL 訪問圖片
咱們終於可以獨立利用阿里雲 OSS 完成一個本身的圖牀服務,可是其實若是你想用阿里雲OSS當作圖牀能夠直接使用極簡圖牀:jiantuku.com 上傳圖片,比較方便!你們可能內心在想那你特麼讓我實現個圖牀幹嗎?我以爲經過學習,你們之後能夠作不少事情,好比 利用阿里雲OSS 存儲服務存放本身網站的相關圖片。
ThoughtWorks准入職Java工程師。專一Java知識分享!開源 Java 學習指南——JavaGuide(12k+ Star)的做者。公衆號多篇文章被各大技術社區轉載。公衆號後臺回覆關鍵字「1」能夠領取一份我精選的Java資源哦!