> 文档中心 > Java实现阿里云OSS上传文件

Java实现阿里云OSS上传文件


1、准备工作:创建操作阿里云OSS许可证

阿里云官方文档
这里不再赘述,根据官方文档一步步的操作就可以了!
下面直接进入实战操作!

2、实战操作

第一步:引入依赖

    <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>aliyun-oss-spring-boot-starter</artifactId>    </dependency>

第二步:在application.properties里配置相关环境

# 服务端口server.port=8002#服务名spring.application.name=service_oss#环境设置:dev test prodspring.profiles.active=dev#阿里云OSS#不同的服务器,地址不同aliyun.oss.file.endpoint=oss-cn-beijing.aliyuncs.comaliyun.oss.file.keyid=LTAI5tCroixxjG2GbLgCVC4Yaliyun.oss.file.keysecret=jM1gUo6w3p1SqGtHgWURXj6sTcaiCT#bucket可以在控制台创建,也可以使用java代码创建aliyun.oss.file.bucketname=edu-2330

第三步:主启动类配置

由于上传本地文件到阿里云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加载之后,执行接口中的一个方法@Componentpublic 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_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);}@Servicepublic 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上传文件的文件名相同时,最后一次会对上一次的文件进行覆盖

@Servicepublic 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;}    }}