OSS-文件存储

【背景】

      存储系统中的图片、音频、视频,且视频的体积较大,可达2GB.

【比较】

      之前存储系统用的是FastDFS,主要是存储一些word文档、图片等小文件;现在用的是阿里云的OSS(OSS的官方文档)。

【简介】

 

FastDFS:

        FastDFS 是以C语言开发的一项开源轻量级分布式文件系统,他对文件进行管理,主要功能有:文件存储,文件同步,文件访问(文件上传/下载), 适用于海量小文件(建议范围:4KB < file_size <500MB)、使用相对简单、小文件存储网上大多推荐使用FastDFS


OSS:

        阿里云对象存储服务(Object Storage Service,简称OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。它是一个分布式的对象存储服务,提供的是一个Key-Value对形式的对象存储服务。用户可以根据Object的名称(Key)唯一的获取该Object的内容。它具有与平台无关的RESTful API接口,能够提供99.99999999%的服务持久性。可以在任何应用、任何时间、任何地点存储和访问任意类型的数据。OSS适合各种网站、开发企业及开发者使用。

【项目代码】

OssController

public class OssController {

    @Autowired
    private OssServiceImpl ossService;

    /**
     * 上传文件
     *
     * @param file
     * @param paramStr
     * @return
     */
    @RequestMapping("/uploadFile")
    public GenericResponse uploadFile(MultipartFile file, @RequestParam(value = "paramStr") String paramStr) {
        GenericResponse genericResponse = null;
        OssRequestVo ossRequestVo = new Gson().fromJson(paramStr, OssRequestVo.class);
        try {
            ossRequestVo.setInputStream(file.getInputStream());
        } catch (IOException e) {
            e.printStackTrace();
        }
        if (ossRequestVo.getInputStream() == null) {
            genericResponse = new GenericResponse(CommonEnum.ResponseCode.输入参数错误.getCode(), "文件流不能为空");
        } else if (StringUtils.isEmpty(ossRequestVo.getKey())) {
            genericResponse = new GenericResponse(CommonEnum.ResponseCode.输入参数错误.getCode(), "文件Key不能为空");
        } else if (StringUtils.isEmpty(ossRequestVo.getBucketName())) {
            genericResponse = new GenericResponse(CommonEnum.ResponseCode.输入参数错误.getCode(), "文件bucket不能为空");
        } else if (ossRequestVo.getStandard() == null) {
            genericResponse = new GenericResponse(CommonEnum.ResponseCode.输入参数错误.getCode(), "文件Standard不能为空");
        } else {
            String url = ossService.uploadFile(ossRequestVo.getBucketName(), ossRequestVo.getInputStream(), ossRequestVo.getKey(), ossRequestVo.getStandard());
            if (StringUtils.isNotEmpty(url)) {
                OssResponseVo ossResponseVo = new OssResponseVo();
                ossResponseVo.setUrl(url);
                genericResponse = new GenericResponse(CommonEnum.ResponseCode.Success.getCode(), "上传成功", ossResponseVo);
            } else {
                genericResponse = new GenericResponse(CommonEnum.ResponseCode.Fail.getCode(), "上传失败");
            }
        }
        return genericResponse;
    }
}
OssServiceImpl 
@Service
public class OssServiceImpl implements OssService {

    @Autowired
    private OSSClient ossClient;


    /**
     * 上传文件
     *
     * @param bucketName
     * @param inputStream
     * @param key         文件名称
     * @return
     */
    @Override
    public String uploadFile(String bucketName, InputStream inputStream, String key, Integer type) {
        //key文件名称
        ossClient.putObject(bucketName, key, inputStream);
        //生成url
        return generatePresignedUrl(bucketName, key, type);

    }


    /**
     * 生成文件访问地址
     *
     * @param key  文件名称
     * @param type 1:标准;2:缩放图;3:icon;4:轮播
     * @return
     */
    public String generatePresignedUrl(String bucketName, String key, Integer type) {
        if (StringUtils.isEmpty(key) || StringUtils.isEmpty(bucketName)) return "";
        Date expiration = DateUtil.getInstance().addYearByN(new Date(), 20);
        // 生成URL
        if (type == null || type <= 0) {
            // 生成URL
            URL url = ossClient.generatePresignedUrl(bucketName, key, expiration);
            return url.toString();
        } else {
            //生成制定尺寸的地址
            String style = "style/";
            if (type == 1) {
                style += CommonEnum.OssFileStandardEnum.STANDARD.getDesc();
            } else if (type == 2) {
                style += CommonEnum.OssFileStandardEnum.THUMBNAIL.getDesc();
            } else if (type == 3) {
                style += CommonEnum.OssFileStandardEnum.ICON.getDesc();
            } else if (type == 4) {
                style += CommonEnum.OssFileStandardEnum.BANNER.getDesc();
            }
            GeneratePresignedUrlRequest req = new GeneratePresignedUrlRequest(bucketName, key, HttpMethod.GET);
            req.setExpiration(expiration);
            req.setProcess(style);
            URL url = ossClient.generatePresignedUrl(req);
            return url.toString();
        }
    }
}

用到的枚举

public enum FileType {
    图片(1, "img_"),
    视频(2, "vedio_"),
    文件(3, "file_"),
    音频(4, "audio_"),;

    private int code;

    private String prefix;

    FileType(int code, String prefix) {
        this.code = code;
        this.prefix = prefix;
    }

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getPrefix() {
        return prefix;
    }

    public void setPrefix(String prefix) {
        this.prefix = prefix;
    }
}

/**
 * 文件存储分类
 */
public enum BucketName {
    音视频(0, "pgy-vedio"),
    图片(1, "pgy-images");

    private Integer code;

    private String desc;

    BucketName(Integer code, String desc) {
        this.code = code;
        this.desc = desc;
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }


}


/**
 * 文件标准
 */
public enum OssFileStandardEnum {
    vedio (0, "vedio"),
    STANDARD(1, "standard"),
    THUMBNAIL(2, "thumbnail"),
    ICON(3, "icon"),
    BANNER(4, "banner");

    private Integer code;
    private String desc;


    OssFileStandardEnum(Integer code, String desc) {
        this.code = code;
        this.desc = desc;
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }

}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值