Java实现阿里云OSS上传文件
时间:2022-11-16 17:00:00
推荐:前几天发现了一个巨牛人工智能学习网站,通俗易懂,幽默幽默,忍不住和大家分享。 点击跳转到网站
1.准备:创建和操作阿里云OSS许可证
官方文档阿里云
这里就不赘述了,根据官方文件一步一步操作就可以了!
直接进入实战操作!
2、实战操作
第一步:引入依赖
<dependency> <groupId>com.alibaba.cloudgroupId> <artifactId>aliyun-oss-spring-boot-starterartifactId> dependency>
第二步:在
application.properties
配置相关环境
# 服务端口 server.port=8002 #服务名 spring.application.name=service_oss #环境设置:dev test prod spring.profiles.active=dev #阿里云OSS #不同的服务器,不同的地址 aliyun.oss.file.endpoint=阿里云OSS地址 aliyun.oss.file.keyid=阿里云KEY_ID aliyun.oss.file.keysecret=阿里云SECRET_KEY #bucket它可以在控制台上创建或使用java代码创建 aliyun.oss.file.bucketname=阿里云BUCKET_NAME
第三步:主启动类配置:
将本地文件上传到阿里云OSS,因此,无需操作数据库,因此需要在主启动类中添加相关注释
//DataSourceAutoConfiguration 因为这个模块使用阿里云OSS存储文件不需要访问数据库 //去掉数据源自动配置类!防止报错! @SpringBootApplication(exclude = DataSourceAutoConfiguration.class) @ComponentScan(basePackages = {
"com.pdx"}) public class OssApplication {
public static void main(String[] args) {
SpringApplication.run(OssApplication.class,args); } }
第四步:创建所需的工具类别
//当项目启动时,Spring接口,spring加载后,执行界面中的一种方法 @Component public class ConstantPropertiesUtils implements InitializinBean {
//读取配置文件内容
@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_POINT;
public static String ACCESS_KEY_ID;
public static String ACCESS_KEY_SECRET;
public static String BUCKET_NAME;
@Override
public void afterPropertiesSet() throws Exception {
END_POINT = endpoint;
ACCESS_KEY_ID = keyId;
ACCESS_KEY_SECRET = keySecret;
BUCKET_NAME = bucketName;
}
}
第五步:编写逻辑代码实现相关功能
- 前端控制层(Controller)
@RestController
@RequestMapping("/eduoss/fileoss")
@CrossOrigin //解决跨域问题
public class OssController {
@Autowired
private OssService ossService;
//上传头像的方法
@PostMapping
public R uploadOssFile(MultipartFile file){
//获取上传的文件,MultipartFile
//返回上传到oss的路径,最后把路径上传到数据库对应字段
String url = ossService.uploadFileAvatar(file);
return R.ok().data("url",url);
}
}
- 业务层(Service | ServiceImpl)
public interface OssService {
//上传文件到OSS
String uploadFileAvatar(MultipartFile file);
}
@Service
public class OssServiceImpl implements OssService {
//上传文件到OSS
@Override
public String uploadFileAvatar(MultipartFile file) {
//通过工具类来获取相应的值
String endpoint = ConstantPropertiesUtils.END_POINT;
String accessKeyId = ConstantPropertiesUtils.ACCESS_KEY_ID;
String accessKeySecret = ConstantPropertiesUtils.ACCESS_KEY_SECRET;
String bucketName = ConstantPropertiesUtils.BUCKET_NAME;
try{
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
// 获取上传文件的输入流
InputStream inputStream = file.getInputStream();
//获取文件名称
String filename = file.getOriginalFilename();
//调用OSS方法实现上传
//第一个参数 Bucket名称
//第二个参数 上传到OSS文件路径和文件名称
//第三个参数 上传文件输入流
ossClient.putObject(bucketName, filename, inputStream);
// 关闭OSSClient。
ossClient.shutdown();
//把上传之后文件路径返回
//需要把上传到阿里云oss路径手动拼接出来
String url = "https://"+bucketName+"."+endpoint+"/"+filename;
return url;
}catch (Exception e){
e.printStackTrace();
return null;
}
}
}
第六步:修改
文件覆盖
问题
由于阿里云OSS上传文件的文件名相同时,最后一次会对上一次的文件进行覆盖
@Service
public class OssServiceImpl implements OssService {
//上传文件到OSS
@Override
public String uploadFileAvatar(MultipartFile file) {
//通过工具类来获取相应的值
String endpoint = ConstantPropertiesUtils.END_POINT;
String accessKeyId = ConstantPropertiesUtils.ACCESS_KEY_ID;
String accessKeySecret = ConstantPropertiesUtils.ACCESS_KEY_SECRET;
String bucketName = ConstantPropertiesUtils.BUCKET_NAME;
try{
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
// 获取上传文件的输入流
InputStream inputStream = file.getInputStream();
//获取文件名称
String filename = file.getOriginalFilename();
//1、在文件名称里添加一个随机唯一的值
String uuid = UUID.randomUUID().toString().replaceAll("-","");
filename = uuid+filename;
//2、把文件按照日期进行分类
// 2021/7/17/xx.jpg
//获取当前的日期
String datePath = new DateTime().toString("yyyy/MM/dd");
filename = datePath+"/"+filename;
//调用OSS方法实现上传
//第一个参数 Bucket名称
//第二个参数 上传到OSS文件路径和文件名称
//第三个参数 上传文件输入流
ossClient.putObject(bucketName, filename, inputStream);
// 关闭OSSClient。
ossClient.shutdown();
//把上传之后文件路径返回
//需要把上传到阿里云oss路径手动拼接出来
String url = "https://"+bucketName+"."+endpoint+"/"+filename;
return url;
}catch (Exception e){
e.printStackTrace();
return null;
}
}
}