首先申请阿里云OSS 获取到阿里云OSS的endpoint,keyid,keysecret三个属性。废话不说,直接上代码!!!
aliyun:
oss:
file:
bucketname:
endpoint:
keyid:
keysecret:
/**
* @author sjsp
* @title UploadController
* @createTime 2022/3/25 14:20
* @Description TODO
*/
import com.xym.utils.oss.AliYunOssUtil;
import com.xym.utils.result.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.util.Date;
import java.util.Objects;
/**
* 公共开放接口
*/
@Slf4j
@Api(tags = "公共开放接口")
@RestController
@RequestMapping("/file")
public class UploadController{
/**
* 公共图片上传
* @param multipartFile
* @return
*/
@ApiOperation(value = "公共图片上传")
@PostMapping("/uploadOssFile")
public Result uploadObject(@RequestPart("file") MultipartFile multipartFile){
Date dt=new Date();
String year=String.format("%tY", dt);
String month=String .format("%tm", dt);
String date=String .format("%td", dt);
String disName = year + "/" + month + "/" + date + "/";
String url = AliYunOssUtil.uploadObject2OSS(multipartFile, disName);
if (Objects.isNull(url)){
return Result.failed("============上传图片失败!================");
}
return Result.success("图片上传成功",url);
}
}
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.Bucket;
import com.aliyun.oss.model.OSSObject;
import com.aliyun.oss.model.ObjectMetadata;
import com.xym.utils.ConstantPropertiesUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.util.Calendar;
import java.util.Date;
import java.util.UUID;
@Component
public class AliYunOssUtil {
private static final Logger LOG = LoggerFactory.getLogger(AliYunOssUtil.class);
private static OSSClient client=null;
private static String ENDPOINT = ConstantPropertiesUtils.END_POIND;
private static String ACCESS_KEY_ID = ConstantPropertiesUtils.ACCESS_KEY_ID;
private static String ACCESS_KEY_SECRET = ConstantPropertiesUtils.ACCESS_KEY_SECRET;
private static String bucketName = ConstantPropertiesUtils.BUCKET_NAME;
/**
* 获取阿里云OSS客户端对象
* */
public static final OSSClient getOSSClient(){
return (OSSClient)new OSSClientBuilder().build(ENDPOINT, ACCESS_KEY_ID, ACCESS_KEY_SECRET);
}
/**
* 新建Bucket --Bucket权限:私有
* @param bucketName bucket名称
* @return true 新建Bucket成功
* */
public static final boolean createBucket(OSSClient client, String bucketName){
Bucket bucket = client.createBucket(bucketName);
return bucketName.equals(bucket.getName());
}
/**
* 删除Bucket
* @param bucketName bucket名称
* */
public static final void deleteBucket(OSSClient client, String bucketName){
client.deleteBucket(bucketName);
LOG.info("删除" + bucketName + "Bucket成功");
}
/**
* 向阿里云的OSS存储中存储文件 --file也可以用InputStream替代
* @param file 上传文件
* @param diskName 文件夹名
* @return String 唯一MD5数字签名
* */
public static final String uploadObject2OSS(MultipartFile file,String diskName) {
String path = null;
String url = null;
String folder = createFolder(bucketName, diskName);
// 文件夹名
try {
OSSClient client = getOSSClient();
InputStream is = file.getInputStream();
String fileName = file.getOriginalFilename();
//创建上传Object的Metadata
ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentLength(is.available());
metadata.setCacheControl("no-cache");
metadata.setHeader("Pragma", "no-cache");
metadata.setContentEncoding("utf-8");
metadata.setContentType("image/jpg");
metadata.setContentType(getContentType(fileName));
String key = UUID.randomUUID().toString().replaceAll("-", "")+fileName.substring(fileName.lastIndexOf("."));
//上传文件
client.putObject(bucketName, folder + key, is, metadata);
// 设置签名URL过期时间为3600秒(1小时)。
Date expiration = new Date(System.currentTimeMillis() + 3600 * 24 * 365 *10);
//解析结果
path = client.generatePresignedUrl(bucketName, folder + key , expiration).toString();
url= path.substring(0, path.lastIndexOf("?"));
url="https://"+bucketName+".oss-cn-beijing.aliyuncs.com/"+folder+key;
} catch (Exception e) {
LOG.error("上传阿里云OSS服务器异常." + e.getMessage(), e);
}
return url;
}
/**
* 根据key获取OSS服务器上的文件输入流
* @param bucketName bucket名称
* @param diskName 文件路径
* @param key Bucket下的文件的路径名+文件名
*/
public static final InputStream getOSS2InputStream( String bucketName, String diskName, String key){
OSSClient client = getOSSClient();
OSSObject ossObj = client.getObject(bucketName, diskName + key);
return ossObj.getObjectContent();
}
/**
* 根据key删除OSS服务器上的文件
* @param bucketName bucket名称
* @param diskName 文件路径
* @param key Bucket下的文件的路径名+文件名
*/
public static void deleteFile( String bucketName, String diskName, String key){
OSSClient client = getOSSClient();
client.deleteObject(bucketName, diskName + key);
LOG.info("删除" + bucketName + "下的文件" + diskName + key + "成功");
}
/**
* 通过文件名判断并获取OSS服务文件上传时文件的contentType
*
* @param fileName 文件名
* @return 文件的contentType
*/
public static final String getContentType(String fileName) {
String fileExtension = fileName.substring(fileName.lastIndexOf(".")+1);
if ("bmp".equalsIgnoreCase(fileExtension)) {
return "image/bmp";
}
if ("gif".equalsIgnoreCase(fileExtension)) {
return "image/gif";
}
if ("jpeg".equalsIgnoreCase(fileExtension) || "jpg".equalsIgnoreCase(fileExtension) || "png".equalsIgnoreCase(fileExtension)) {
return "image/jpg";
}
if ("html".equalsIgnoreCase(fileExtension)) {
return "text/html";
}
if ("txt".equalsIgnoreCase(fileExtension)) {
return "text/plain";
}
if ("vsd".equalsIgnoreCase(fileExtension)) {
return "application/vnd.visio";
}
if ("ppt".equalsIgnoreCase(fileExtension) || "pptx".equalsIgnoreCase(fileExtension)) {
return "application/vnd.ms-powerpoint";
}
if ("doc".equalsIgnoreCase(fileExtension) || "docx".equalsIgnoreCase(fileExtension)) {
return "application/msword";
}
if ("xml".equalsIgnoreCase(fileExtension)) {
return "text/xml";
}
return "text/html";
}
/**
* (private)获得指定日期之后一段时期的日期。例如某日期之后3天的日期等。
* @param origDate 基准日期
* @param amount 基准日期
* @param timeUnit 时间单位,如年、月、日等。用Calendar中的常量代表
* @return
*/
private static final Date dateAfter(Date origDate, int amount, int timeUnit) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(origDate);
calendar.add(timeUnit, amount);
return calendar.getTime();
}
/**
* 创建模拟文件夹
*
* param ossClient oss连接
* param bucketName 存储空间
* param folder 模拟文件夹名如"qj_nanjing/"
* return 文件夹名
*/
public static String createFolder(String bucketName, String folder) {
// 文件夹名
final String keySuffixWithSlash = folder;
// 判断文件夹是否存在,不存在则创建
OSSClient client = getOSSClient();
if (!client.doesObjectExist(bucketName, keySuffixWithSlash)) {
// 创建文件夹
client.putObject(bucketName, keySuffixWithSlash, new ByteArrayInputStream(new byte[0]));
LOG.info("创建文件夹成功");
// 得到文件夹名
OSSObject object = client.getObject(bucketName, keySuffixWithSlash);
String fileDir = object.getKey();
return fileDir;
}
return keySuffixWithSlash;
}
}
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
/**
* @author : rmq
* @date : 2021/11/18 15:54
*/
@Component
public class ConstantPropertiesUtils implements InitializingBean {
//读取配置文件内容
@Value("${aliyun.oss.file.endpoint}")
private String endpoint;
@Value("${aliyun.oss.file.keyid}")
private String keyId;
@Value("${aliyun.oss.file.keysecret}")
private String keySecret;
@Value("${aliyun.oss.file.bucketname}")
private String bucketName;
//定义公开静态常量
public static String END_POIND;
public static String ACCESS_KEY_ID;
public static String ACCESS_KEY_SECRET;
public static String BUCKET_NAME;
@Override
public void afterPropertiesSet() throws Exception {
END_POIND = endpoint;
ACCESS_KEY_ID = keyId;
ACCESS_KEY_SECRET = keySecret;
BUCKET_NAME = bucketName;
}
}