快速上手OSS图片视频上传

一篇看懂OSS图片视频上传

简介

图片视频上传存储的方式有很多种,比如存在项目中、存在本地、存在服务器、放入第三方例如gitee、oss等,但在公司一般的业务中不会已前三者的方式存储。
问题:

  1. 存在项目中会很臃肿(文件大小不用说,上传服务器都懂);
  2. 存在本地,如果上传到服务器上也就获取不到视频图片了;
  3. 直接存在服务器中也是可以的,但是没试过

因为自己需求做朋友圈的动态发布,所以用整合OSS存储图片和视频充当笔记(OSS是收费的,有兴趣老表可以把图片存到gitee也可以,因为gitee是免费,可以用HttpClient读写)
gitee API : https://gitee.com/api/v5/swagger#/getV5ReposOwnerRepoStargazers?ex=no

SpringBoot整合OSS

pom.xml

   <!--   oss     -->
        <dependency>
            <groupId>com.aliyun.oss</groupId>
            <artifactId>aliyun-sdk-oss</artifactId>
            <version>2.8.3</version>
        </dependency>

application.yml

#swagger
lanys:
  swagger:
    title: 牟某公司
    description: 牟某公司
    termsOfServiceUrl: https://eurasia.plus/swagger-ui.html
    ContactName: xxx
    ContactUrl: https://eurasia.plus/swagger-ui.html
    ContactEmail: 1090613735@qq.com
    version: 1.0
  aliyun:
    access_key_id: 拿自己OSS对应的数据
    access_key_secret: 拿自己OSS对应的数据
    bucket: 拿自己OSS对应的数据
    endpoint: 拿自己OSS对应的数据

AliyunConfig

/**
 * @author lanys
 * @Description:
 * @date 2/7/2021 下午3:12
 */

@Configuration
@ConfigurationProperties(prefix = "lanys.aliyun")
@Data
public class AliyunConfig {
    private String access_key_id;
    private String access_key_secret;
    private String endpoint;
    private String bucket;

    @Bean
    public OSS oSSClient() {
        return new OSSClient(endpoint, access_key_id, access_key_secret);
    }
}

Controller

    @Autowired
    private UpLoadFileUtil upLoadFileUtil;


    @ApiOperation(value = "上传图片视频")
    @PostMapping("/upload")
    @ResponseBody
    public List<OSSObjectSummary> create(MultipartFile[] upload) throws Exception {
        upLoadFileUtil.upLoadVideos(upload);
        return Result.success();
    }

UpLoadFileUtil(工具)

/**
 * @author lanys
 * @Description:
 * @date 2/7/2021 上午10:36
 */
@Component
@Slf4j
public class UpLoadFileUtil {
    
    /**
     * 图片格式
     */
    private static final String[] IMAGE_TYPE = new String[]{".bmp", ".jpg",
            ".jpeg", ".gif", ".png"};

    private static final String[] VIDEOS = new String[]{".mp4"};

    @Autowired
    private OSS ossClient;

    @Autowired
    private AliyunConfig aliyunConfig;

    /**
     * 图像上传
     * @param uploadFile 图像流处理
     * @return
     * @throws IOException
     */
    public  Boolean UpLoadImage(MultipartFile[] uploadFile) throws IOException {

        // 校验图片格式
        boolean isLegal = false;
        log.info("----校验图片格式---");
        for (MultipartFile multipartFile : uploadFile) {
            // 校验图片格式
            for (String type : IMAGE_TYPE) {
                if (StringUtils.endsWithIgnoreCase(multipartFile.getOriginalFilename(), type)) {
                    isLegal = true;
                    break;
                }
            }
        }
        if (!isLegal){
            log.info("----图片格式有误---");
            return false;
        }
        for (MultipartFile multipartFile: uploadFile) {

            //获取图片名称
            String originalFilename = multipartFile.getOriginalFilename();
            String filePath = getFilePath(originalFilename);
            System.out.println(filePath);

            try {
                ossClient.putObject(aliyunConfig.getBucket(), filePath, new
                        ByteArrayInputStream(multipartFile.getBytes()));
                log.info("--------图片上传成功--------");
            } catch (Exception e) {
                e.printStackTrace();
                log.info("上传失败");
                return false;
            }
        }
        return true;
    }



    /**
     * 视频上传
     * @param uploadFile 视频流处理
     * @return
     * @throws IOException
     */
    public Boolean upLoadVideos(MultipartFile[] uploadFile) throws IOException {

        // 校验图片格式
        boolean isLegal = false;
        log.info("----校验图片格式---");
        for (MultipartFile multipartFile : uploadFile) {
            // 校验图片格式
            for (String type : VIDEOS) {
                if (StringUtils.endsWithIgnoreCase(multipartFile.getOriginalFilename(), type)) {
                    isLegal = true;
                    break;
                }
            }
        }
        if (!isLegal){
            log.info("----视频格式有误---");
            return false;
        }
        for (MultipartFile multipartFile: uploadFile) {

            //获取图片名称
            String originalFilename = multipartFile.getOriginalFilename();
            String filePath = getFilePath(originalFilename);
            System.out.println(filePath);

            try {
                ossClient.putObject(aliyunConfig.getBucket(), filePath, new
                        ByteArrayInputStream(multipartFile.getBytes()));
                log.info("--------视频上传成功--------");
            } catch (Exception e) {
                e.printStackTrace();
                log.info("上传失败");
                return false;
            }
        }
        return true;
    }
    
    /**
     * 生成路径以及文件名
     * @param sourceFileName
     * @return
     */
    private String getFilePath(String sourceFileName) {
        DateTime dateTime = new DateTime();
        return "uploads/dynamic/pictures/" + dateTime.toString("yyyy") + dateTime.toString("MM") + dateTime.toString("dd") + "/" + System.currentTimeMillis() +
                RandomUtils.nextInt(100, 9999) + "." +
                StringUtils.substringAfterLast(sourceFileName, ".");
    }
}

留了个坑,虽然图片和视频已经上传OSS中,但是做视频截取图片javacv及没有拼接路径,然后存储到数据库中,有兴趣可以自己动手。

OSS拼接的格式:

aliyun:
  access_key_id: LTAI5tR3MemYvQMWpyy2spT2
  access_key_secret: W0WfKE8WD3LZ8mQ2x5PMTZp820AFZ1
  ##桶
  bucket: id2
  endpoint: id3
    /**
     * 生成路径以及文件名
     * @param sourceFileName
     * @return
     */
    private String getFilePath(String sourceFileName) {
        DateTime dateTime = new DateTime();
        return "uploads/dynamic/pictures/" + dateTime.toString("yyyy") + dateTime.toString("MM") + dateTime.toString("dd") + "/" + System.currentTimeMillis() +
                RandomUtils.nextInt(100, 9999) + "." +
                StringUtils.substringAfterLast(sourceFileName, ".");
    }

对照配置文件,格式就是:

https://id2.id3/生成路径以及文件名

例子:

http://resource.develop.hulimedib.com/uploads/dynamic/pictures/20200922/c5cfe146b656a9aa242993ea335de60d.PNG

总结:

整合的整个过程很简单,依赖+配置文件id,key等,配置bean带入id+key等就可以操作OSS中的文件读取。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值