詳解SpringBoot上傳圖片到阿里云的OSS對(duì)象存儲(chǔ)中
啟動(dòng)idea創(chuàng)建一個(gè)SpringBoot項(xiàng)目




將上面的步驟完成之后,點(diǎn)擊下一步創(chuàng)建項(xiàng)目

創(chuàng)建完成之后修改pom.xml文件,添加阿里云oss依賴

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency>
修改配置文件,將配置文件后綴名修改為yml類型的配置文件,并對(duì)阿里云oss進(jìn)行參數(shù)的配置

server: port: 8088 # 阿里云存儲(chǔ)參數(shù)配置 aliyun: oss: endpoint: accessKeyId: accessKeySecret: bucketName:
上面的參數(shù)我們首先進(jìn)入阿里云官網(wǎng),登錄并進(jìn)入自己的控制臺(tái)

創(chuàng)建一個(gè),方框中就是yml配置文件中的bucketName

點(diǎn)擊進(jìn)入就可以看見外網(wǎng)訪問地址,將這個(gè)地址填寫到y(tǒng)ml配置文件中的endpoint

點(diǎn)擊頭像,選擇AccessKey管理

選擇繼續(xù)使用AccessKey

創(chuàng)建一個(gè)AccessKey

創(chuàng)建成功,yml配置文件中的accessKeyId,accessKeySecret,對(duì)應(yīng)填入相應(yīng)位置

創(chuàng)建一個(gè)util(里面放oss工具類)文件夾,里面創(chuàng)建一個(gè)OssUtil的類。再創(chuàng)建一個(gè)Controller文件夾,里面創(chuàng)建一個(gè)OssController的文件

OssUtil類
package com.example.ossdemo.util;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.model.ObjectMetadata;
import com.aliyun.oss.model.PutObjectResult;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.*;
/**
* 阿里云OSS服務(wù)器工具類
*/
@Component
public class OssUtil {
//---------變量----------
protected static final Logger log = LoggerFactory.getLogger(OssUtil.class);
@Value("${aliyun.oss.endpoint}")
private String endpoint;
@Value("${aliyun.oss.accessKeyId}")
private String accessKeyId;
@Value("${aliyun.oss.accessKeySecret}")
private String accessKeySecret;
@Value("${aliyun.oss.bucketName}")
private String bucketName;
//文件存儲(chǔ)目錄
private String filedir = "my_file/";
/**
* 1、單個(gè)文件上傳
* @param file
* @return 返回完整URL地址
*/
public String uploadFile(MultipartFile file) {
String fileUrl = uploadImg2Oss(file);
String str = getFileUrl(fileUrl);
return str.trim();
}
/**
* 1、單個(gè)文件上傳(指定文件名(帶后綴))
* @param file
* @return 返回完整URL地址
*/
public String uploadFile(MultipartFile file,String fileName) {
try {
InputStream inputStream = file.getInputStream();
this.uploadFile2OSS(inputStream, fileName);
return fileName;
}
catch (Exception e) {
return "上傳失敗";
}
}
/**
* 2、多文件上傳
* @param fileList
* @return 返回完整URL,逗號(hào)分隔
*/
public String uploadFile(List<MultipartFile> fileList) {
String fileUrl = "";
String str = "";
String photoUrl = "";
for(int i = 0;i< fileList.size();i++){
fileUrl = uploadImg2Oss(fileList.get(i));
str = getFileUrl(fileUrl);
if(i == 0){
photoUrl = str;
}else {
photoUrl += "," + str;
}
}
return photoUrl.trim();
}
/**
* 3、通過文件名獲取文完整件路徑
* @param fileUrl
* @return 完整URL路徑
*/
public String getFileUrl(String fileUrl) {
if (fileUrl !=null && fileUrl.length()>0) {
String[] split = fileUrl.split("/");
String url = this.getUrl(this.filedir + split[split.length - 1]);
return url;
}
return null;
}
//獲取去掉參數(shù)的完整路徑
private String getShortUrl(String url) {
String[] imgUrls = url.split("\\?");
return imgUrls[0].trim();
}
// 獲得url鏈接
private String getUrl(String key) {
// 設(shè)置URL過期時(shí)間為20年 3600l* 1000*24*365*20
Date expiration = new Date(new Date().getTime() + 3600l * 1000 * 24 * 365 * 20);
// 生成URL
OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
URL url = ossClient.generatePresignedUrl(bucketName, key, expiration);
if (url != null) {
return getShortUrl(url.toString());
}
return null;
}
// 上傳文件
private String uploadImg2Oss(MultipartFile file) {
//1、限制最大文件為20M
if (file.getSize() > 1024 * 1024 *20) {
return "圖片太大";
}
String fileName = file.getOriginalFilename();
String suffix = fileName.substring(fileName.lastIndexOf(".")).toLowerCase(); //文件后綴
String uuid = UUID.randomUUID().toString();
String name = uuid + suffix;
try {
InputStream inputStream = file.getInputStream();
this.uploadFile2OSS(inputStream, name);
return name;
}
catch (Exception e) {
return "上傳失敗";
}
}
// 上傳文件(指定文件名)
private String uploadFile2OSS(InputStream instream, String fileName) {
String ret = "";
try {
//創(chuàng)建上傳Object的Metadata
ObjectMetadata objectMetadata = new ObjectMetadata();
objectMetadata.setContentLength(instream.available());
objectMetadata.setCacheControl("no-cache");
objectMetadata.setHeader("Pragma", "no-cache");
objectMetadata.setContentType(getcontentType(fileName.substring(fileName.lastIndexOf("."))));
objectMetadata.setContentDisposition("inline;filename=" + fileName);
//上傳文件
OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
PutObjectResult putResult = ossClient.putObject(bucketName, filedir + fileName, instream, objectMetadata);
ret = putResult.getETag();
} catch (IOException e) {
log.error(e.getMessage(), e);
} finally {
try {
if (instream != null) {
instream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return ret;
}
private static String getcontentType(String FilenameExtension) {
if (FilenameExtension.equalsIgnoreCase(".bmp")) {
return "image/bmp";
}
if (FilenameExtension.equalsIgnoreCase(".gif")) {
return "image/gif";
}
if (FilenameExtension.equalsIgnoreCase(".jpeg") ||
FilenameExtension.equalsIgnoreCase(".jpg") ||
FilenameExtension.equalsIgnoreCase(".png")) {
return "image/jpeg";
}
if (FilenameExtension.equalsIgnoreCase(".html")) {
return "text/html";
}
if (FilenameExtension.equalsIgnoreCase(".txt")) {
return "text/plain";
}
if (FilenameExtension.equalsIgnoreCase(".vsd")) {
return "application/vnd.visio";
}
if (FilenameExtension.equalsIgnoreCase(".pptx") ||
FilenameExtension.equalsIgnoreCase(".ppt")) {
return "application/vnd.ms-powerpoint";
}
if (FilenameExtension.equalsIgnoreCase(".docx") ||
FilenameExtension.equalsIgnoreCase(".doc")) {
return "application/msword";
}
if (FilenameExtension.equalsIgnoreCase(".xml")) {
return "text/xml";
}
//PDF
if (FilenameExtension.equalsIgnoreCase(".pdf")) {
return "application/pdf";
}
return "image/jpeg";
}
}
OssController類
package com.example.ossdemo.controller;
import com.example.ossdemo.util.OssUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.util.HashMap;
import java.util.Map;
@RestController
@RequestMapping("/oss")
public class OssController {
@Autowired
OssUtil ossUtil; //注入OssUtil
@PostMapping("/uploadfile")
public Object fileUpload(@RequestParam("file") MultipartFile file)
{
try {
String url = ossUtil.uploadFile(file); //調(diào)用OSS工具類
Map<String, Object> returnbody = new HashMap<>();
Map<String, Object> returnMap = new HashMap<>();
returnMap.put("url", url);
returnbody.put("data",returnMap);
returnbody.put("code","200");
returnbody.put("message","上傳成功");
return returnbody;
}
catch (Exception e) {
Map<String, Object> returnbody = new HashMap<>();
returnbody.put("data",null);
returnbody.put("code","400");
returnbody.put("message","上傳失敗");
return returnbody;
}
}
}
使用postman進(jìn)行請(qǐng)求

這樣就可以將文件上傳到阿里云OSS啦

另外如果對(duì)這個(gè)項(xiàng)目不懂的,可以再底部留言哦,看見回復(fù)。要源碼的小伙伴我將源碼放在碼云,自取哦!
總結(jié)
到此這篇關(guān)于詳解SpringBoot上傳圖片到阿里云的OSS對(duì)象存儲(chǔ)中的文章就介紹到這了,更多相關(guān)SpringBoot上傳阿里云的OSS內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Maven搭建springboot項(xiàng)目的方法步驟
這篇文章主要介紹了Maven搭建springboot項(xiàng)目的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04
SpringBoot下使用MyBatis-Puls代碼生成器的方法
這篇文章主要介紹了SpringBoot下使用MyBatis-Puls代碼生成器的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10
Java實(shí)現(xiàn)郵件發(fā)送的過程及代碼詳解
這篇文章主要介紹了Java實(shí)現(xiàn)郵件發(fā)送的過程及代碼詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
關(guān)于springboot使用rocketmq?RocketMQMessageListener參數(shù)問題
這篇文章主要介紹了springboot使用rocketmq?RocketMQMessageListener參數(shù)問題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值需要的朋友可以參考下2022-11-11
IDEA的Mybatis Log Plugin插件配置和使用詳解
這篇文章主要介紹了IDEA的Mybatis Log Plugin插件配置和使用,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09
SpringBoot實(shí)現(xiàn)動(dòng)態(tài)數(shù)據(jù)源切換的方法總結(jié)
項(xiàng)目開發(fā)中經(jīng)常會(huì)遇到多數(shù)據(jù)源同時(shí)使用的場(chǎng)景,比如冷熱數(shù)據(jù)的查詢等情況,所以接下來(lái)本文就來(lái)介紹一下如何使用實(shí)現(xiàn)自定義注解的形式來(lái)實(shí)現(xiàn)動(dòng)態(tài)數(shù)據(jù)源切換吧2023-12-12
Jdbc的步驟以及簡(jiǎn)單實(shí)現(xiàn)代碼
下面小編就為大家?guī)?lái)一篇Jdbc的步驟以及簡(jiǎn)單實(shí)現(xiàn)代碼。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧2016-07-07
阿里巴巴 Sentinel + InfluxDB + Chronograf 實(shí)現(xiàn)監(jiān)控大屏
這篇文章主要介紹了阿里巴巴 Sentinel + InfluxDB + Chronograf 實(shí)現(xiàn)監(jiān)控大屏,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-09-09

