开通阿里云OSS
开通后创建bunket
依赖
<!-- 阿里云oss依赖 -->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
</dependency>
application.properties
#阿里云 OSS
#不同的服务器,地址不同
aliyun.oss.file.endpoint=oss-cn-shanghai.aliyuncs.com
aliyun.oss.file.keyid=12LTAI5tNTmM7cf4Xasbzd3Q5MC12
aliyun.oss.file.keysecret=12LJMCNiwczE3vfZVJLdajGI7t0SFZ6pA12
#bucket可以在控制台创建,也可以使用java代码创建
aliyun.oss.file.bucketname=shengun1
#上传到本地存储
images.native.save=D:/pdf/images/
images.nginx.url=http://localhost:81/
#SpringBoot上传限制大小
#是设置单个文件的大小,
spring.servlet.multipart.max-file-size = 100MB
#是设置单次请求的文件的总大小
spring.servlet.multipart.max-request-size = 150MB
管理配置ConstantPropertiesUtil
package com.shengun.oss.utills;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class ConstantPropertiesUtil 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;
@Value("${images.native.save}")
private String nativeSave;
@Value("${images.nginx.url}")
private String nginxUrl;
public static String END_POINT;
public static String KEY_ID;
public static String KEY_SECRET;
public static String BUCKET_NAME;
public static String NATIVE_SAVE;
public static String NGINX_URL;
@Override
public void afterPropertiesSet() throws Exception {
END_POINT = endpoint;
KEY_ID = keyid;
KEY_SECRET = keysecret;
BUCKET_NAME = bucketname;
NATIVE_SAVE = nativeSave;
NGINX_URL = nginxUrl;
}
}
OssService
package com.shengun.oss.service;
import org.springframework.web.multipart.MultipartFile;
public interface OssService {
public String uploadFileAvatar(MultipartFile file);
public String uploadNativeAvatar(MultipartFile file);
}
OssServiceImpl
package com.shengun.oss.service.impl;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.shengun.oss.service.OssService;
import com.shengun.oss.utills.ConstantPropertiesUtil;
import lombok.extern.slf4j.Slf4j;
import org.joda.time.DateTime;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;
@Service
@Slf4j
public class OssServiceImpl implements OssService {
/**
* 上传到阿里云oss
* @param file 上传文件流
* @return
*/
@Override
public String uploadFileAvatar(MultipartFile file) {
// OSS上传四个参数
String endPoint = ConstantPropertiesUtil.END_POINT;
String keyId = ConstantPropertiesUtil.KEY_ID;
String keySecret = ConstantPropertiesUtil.KEY_SECRET;
String bucketName = ConstantPropertiesUtil.BUCKET_NAME;
InputStream inputStream = null;
try {
OSS ossClient = new OSSClientBuilder().build(endPoint, keyId, keySecret);
//获取文件上传输入流
inputStream = file.getInputStream();
//获取文件名称
String filename = file.getOriginalFilename();
//1、UUID值
String uuid = UUID.randomUUID().toString().replace("-","");
filename = uuid + filename;
//2、日期时间
String dataPath = new DateTime().toString("yyyy/MM/dd");
//拼接
filename = dataPath + "/" + filename;
log.info("#################上传文件名称:" + filename);
//调用oss实例中的方法实现上传
//参数1: Bucket名称
//参数2: 上传到oss文件路径和文件名称 aa/bb/1.jpg
//参数3: 上传文件的输入流
ossClient.putObject(bucketName, filename, inputStream);
//关闭
ossClient.shutdown();
String url = "https://" + bucketName + "." + endPoint + "/" + filename;
log.info("#################上传成功url:" + url);
return url;
}catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 上传到本地
* @param file 上传文件流
* @return
*/
@Override
public String uploadNativeAvatar(MultipartFile file) {
//本地存储路径
String nativeSave = ConstantPropertiesUtil.NATIVE_SAVE;
//通过nginx做负载
String nginxUrl = ConstantPropertiesUtil.NGINX_URL;
String returnUrl = "";
//原来的名称
String fileName = file.getOriginalFilename();
//获取文件后缀名
String suffixName = fileName.substring(fileName.lastIndexOf("."));
//重新生成文件名
fileName = UUID.randomUUID()+suffixName;
//根据时间创建出时间目录,也就是2022/04/18日期的文件存在在2022/04/18目录下
SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd");
String savePath = format.format(new Date());
savePath = nativeSave + savePath;
File fileDataPath = new File(savePath);
if(!fileDataPath.exists()){
log.info("#######路径不存在,创建路径:" + savePath);
fileDataPath.mkdirs();
}
//上传操作
savePath = savePath + "/" +fileName;
try {
//上传
file.transferTo(new File(savePath));
log.info("#################上传成功保存本地路径:" + savePath);
returnUrl = nginxUrl + savePath.replace(nativeSave, "");
log.info("#################上传成功保存url:" + returnUrl);
return returnUrl;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
}
OssController
package com.shengun.oss.conrtoller;
import com.shengun.commonutils.R;
import com.shengun.oss.service.OssService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.util.HashMap;
import java.util.Map;
/**
* 通过swagger来测试接口
* http://localhost:8002/swagger-ui.html
*/
@RestController
@RequestMapping("/eduoss/fileoss")
@CrossOrigin
public class OssController {
@Autowired
private OssService ossService;
@PostMapping("/upload")
public R uploadOssFile(MultipartFile file){
String url = ossService.uploadFileAvatar(file);
return R.ok().data("url", url).message("文件上传成功!");
}
@PostMapping("/uploadNative")
public R uploadNativeFile(MultipartFile file){
String url = ossService.uploadNativeAvatar(file);
return R.ok().data("url",url).message("文件上传成功!");
}
}
测试,使用swigger测试,也可以使用前端调用
我这里的接口都是可以跨域名的
先测试阿里云的
测试本地的