阿里云oos(上传图片,文件等)

1、配置pom.xml

<dependencies>
    <!-- 阿里云oss依赖 -->
    <dependency>
        <groupId>com.aliyun.oss</groupId>
        <artifactId>aliyun-sdk-oss</artifactId>
         <version>3.1.0</version>
    </dependency><!-- 日期工具栏依赖 -->
    <dependency>
        <groupId>joda-time</groupId>
        <artifactId>joda-time</artifactId>
        <version> 2.10.1</version>
    </dependency>
</dependencies>

2、配置application.properties

#服务端口
server.port=8002
#服务名
spring.application.name=service-oss

#环境设置:dev、test、prod
spring.profiles.active=dev

#阿里云 OSS
#不同的服务器,地址不同
#前后不能加空格,空格也会作为秘钥的一部分
aliyun.oss.file.endpoint="阿里接点"
aliyun.oss.file.keyid="你的accessKeyId"
aliyun.oss.file.keysecret="你的accessKeySecret"
#bucket可以在控制台创建,也可以使用java代码创建
aliyun.oss.file.bucketname="阿里bucketname"

3、创建启动类

//创建OssApplication.java
//如果不需要使用数据库
//@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
@SpringBootApplication
@ComponentScan({"com.yzh"})
public class OssApplication {public static void main(String[] args) {
        SpringApplication.run(OssApplication.class, args);
    }
}

4、启动项目

报错

spring boot 会默认加载org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration这个类,
而DataSourceAutoConfiguration类使用了@Configuration注解向spring注入了dataSource bean,又因为项目(oss模块)中并没有关于dataSource相关的配置信息,所以当spring创建dataSource bean时因缺少相关的信息就会报错。
解决办法:

方法1、在@SpringBootApplication注解上加上exclude,解除自动加载DataSourceAutoConfiguration
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)

**

二、实现文件上传

**

1、从配置文件读取常量

创建常量读取工具类:ConstPropertiesUtil.java
使用@Value读取application.properties里的配置内容
用spring的 InitializingBean 的 afterPropertiesSet 来初始化配置信息,这个方法将在所有的属性被初始化后调用。

//当项目启动,spring接口,spring加载之后,执行接口一个方法
@Component
public class ConstPropertiesUtils 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;


    }
}

2、文件上传

创建Service接口:

public interface OssService {
    //文件上传至阿里云
    String uploadFileAvatar(MultipartFile file);
}

实现:OssService
参考SDK中的:Java->上传文件->简单上传->流式上传->上传文件流

@Service
public class OssServiceImp implements OssService {
    //上传头像到oss
    @Override
    public String uploadFileAvatar(MultipartFile file) {
        //用自定义的工具类获取值
        String endpoint = ConstPropertiesUtils.END_POINT;
        String accessKeyId = ConstPropertiesUtils.ACCESS_KEY_ID;
        String accessKeySecret = ConstPropertiesUtils.ACCESS_KEY_SECRET;
        String bucketName = ConstPropertiesUtils.BUCKET_NAME;
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        try {
            //构建日期路径 2019/02/26/文件名
            //使用joda 类
            String dateTime = new DateTime().toString("yyyy/MM/dd");
            // 上传文件流。
            InputStream inputStream = file.getInputStream();
            //获取文件名称
            String filename = file.getOriginalFilename();
            //防止上传文件名重复,会覆盖原来的
            String uuid = UUID.randomUUID().toString().replaceAll("-", "");
            //最终目录
            //2020/05/21/fbd563ca582a41daa051327cb3fa84501.jpg"
            filename = dateTime+"/"+uuid + filename;

            //调用oss方法实现上传
            //第一个参数 bucketName
            //第二个参数,上传到oss的文件和路径名称 /aa/bb/jj.jpg
            //第三个参数 上传文件输入流
            ossClient.putObject(bucketName, filename, inputStream);
            //获取上传之后的路径
            //需要手动拼接上传到阿里云的oss路径
            //https://yzh-teacher.oss-cn-beijing.aliyuncs.com/%E9%A3%8E%E6%99%AF1.jpg
            String url = "https://" + bucketName + "." + endpoint + "/" + filename;
            return url;
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }finally {
            // 关闭OSSClient。
            ossClient.shutdown();
        }
    }
}

3、控制层

创建controller:

@RestController
@RequestMapping("/teacher")
@CrossOrigin //跨域
public class OssController {
    @Autowired
    private OssService ossService;
    @PostMapping("uploadAvatar")
    public Result uploadAvatar(MultipartFile file) {
        String url = ossService.uploadFileAvatar(file);
        return Result.success().data("url", url);
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yzhSWJ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值