PBC-阿里云OSS实践

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储 OSS,内容安全 1000次 1年
对象存储 OSS,恶意文件检测 1000次 1年
简介: 文件上传,相信我们在大多数业务场景下都有这个需求。这个功能对业务系统来说也比较独立,和系统耦合度不高,所以完全可以利用组装式思想对其PBC化,使其能够被任何业务系统使用。

PBC-阿里云OSS实践

前言

文件上传,相信我们在大多数业务场景下都有这个需求。这个功能对业务系统来说也比较独立,和系统耦合度不高,所以完全可以利用组装式思想对其PBC化,使其能够被任何业务系统使用。

功能

  • 文件上传
  • 文件下载
  • 文件详情
  • 文件列表
  • 文件删除

设计

我们选择阿里云的OSS服务进行文件存储,自己设计文件管理。

设计的关键是需要被任何业务系统使用,我们需要对各业务进行标识。通常情况下,业务一般具有自己的唯一标识,例如主键id等,所以我们通过下面几个参数就能唯一确定一个业务对象。

  • 业务码 biz_code
  • 业务唯一标识 biz_id
  • 业务扩展 biz_content

我们设计一张表来存储文件信息

create table if not exists attachment
(
    id           bigint auto_increment comment '主键'
        primary key,
    gmt_create   datetime                not null comment '创建时间',
    gmt_modified datetime                null comment '修改时间',
    file_key     varchar(64)             null comment '文件key',
    file_type    tinyint                 null comment '1文件、2图片',
    biz_id       bigint                  null comment '业务id',
    biz_type     tinyint      default 0  not null comment '业务类型:0自检文件、1素材文件',
    file_name    varchar(128) default '' not null comment '文件名',
    file_size    bigint       default 0  not null comment '文件大小 byte',
    status       tinyint      default 2  null comment '0 删除 1 上传中 2 正常',
    file_suffix  varchar(32)             null comment '文件类型后缀',
    constraint uk_file_key
        unique (file_key)
)
    comment '附件' charset = utf8mb4;

实现

文件上传

利用阿里云OSS的能力,获取OSS的临时授权上传链接,业务系统拿到这个链接后,使用这个链接直接将文件上传了阿里云OSS服务器。

    public FileUpdateResult uploadFile(String fileName, String bucketName) {
        OSS ossClient = ossConfigProperties.getOssClient();
        // 文件名生成
        String suffix = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();
        String uuid = RandomStringUtils.randomAlphanumeric(32);
        String fileKey = "oneyoung/" + uuid + "." + suffix;
        // 生成签名URL。
        GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, fileKey, HttpMethod.PUT);
        // 设置过期时间。
        long expireEndTime = System.currentTimeMillis() + 60 * 60 * 1000;
        Date expiration = new Date(expireEndTime);
        request.setExpiration(expiration);
        // 添加用户自定义元信息。
        request.addUserMetadata("author", "oneyoung");
        // 设置Content-Type。
        Mimetypes instance = Mimetypes.getInstance();
        String mimetype = instance.getMimetype(fileName);
        request.setContentType(mimetype);
        String url = "https://" + bucketName + "." + ossConfigProperties.getEndPoint() + "/" + fileKey;
        // 通过HTTP PUT请求生成签名URL。
        URL signedUrl = ossClient.generatePresignedUrl(request);
        log.info("signed url for putObject: " + signedUrl);
        // 添加PutObject请求头。
        ossClient.shutdown();
        return new FileUpdateResult(url, mimetype, signedUrl.toString(), fileKey, suffix);
    }

    public AppDataResult<Map<String, String>> getFileUploadInfos(PolymerizeAttachmentDTO request) {
        String fileName = request.getFileName();
        Map<String, String> result;
        //插入附件信息表中
        PolymerizeAttachmentDO polymerizeAttachmentDO = PolymerizeAttachmentDO.builder()
                .bizId(request.getBizId())
                .fileName(request.getFileName())
                .fileSize(request.getFileSize())
                .bizCode(request.getBizCode())
                .fileType(request.getFileType())
                .gmtCreate(LocalDateTime.now())
                .status(AttachmentStatusEnum.UPLOAD_STATUS.getValue())
                .build();
        //如果上传的附件是视频,调用vod服务
        if (FileTypeEnum.VIDEO_TYPE.getValue().equals(request.getFileType())) {
            Long fileSize = request.getFileSize();
            try {
                result = appVodService.getUploadVideoInfos(fileName, fileSize);
                String videoId = result.get("videoId");
                polymerizeAttachmentDO.setFileKey(videoId);
                polymerizeAttachmentDO.setFileSuffix(videoId);
            } catch (Exception e) {
                log.info("获取vod上传服务报错:" + e);
                return AppDataResult.fail("获取vod上传服务报错");
            }
        } else {
            //1.获取文件上传地址信息
            FileUpdateResult fileUpdateResult = fileRepository.uploadFileToDefaultBucket(fileName);
            //2.解析文件上传结果信息
            result = fileRepository.getResultMap(fileUpdateResult);
            polymerizeAttachmentDO.setFileKey(fileUpdateResult.getFileKey());
            polymerizeAttachmentDO.setFileSuffix(fileUpdateResult.getSuffix());
        }
        polymerizeAttachmentMapper.insert(polymerizeAttachmentDO);
        result.put("id", polymerizeAttachmentDO.getId().toString());
        return AppDataResult.success(result);
    }

由于我们的文件管理是自己控制,而文件上传最终是直接与OSS服务器进行对接,所以,我们系统并不知道文件是否真的上传成功,我们需要提供一个回调接口来确认文件是否上传成功。

    public AppDataResult<Boolean> updateFileStatus(Long id) {
        PolymerizeAttachmentDO polymerizeAttachmentDO = PolymerizeAttachmentDO.builder()
                .id(id)
                .status(AttachmentStatusEnum.NORMAL_STATUS.getValue())
                .build();
        polymerizeAttachmentMapper.updateByPrimaryKeySelective(polymerizeAttachmentDO);
        return AppDataResult.success(true);
    }

文件下载

通过biz_id、biz_code下载文件,获取到OSS的下载链接,业务系统直接下载



public AppDataResult<List<PolymerizeAttachmentDTO>> getFileDownInfos(Long bizId, String bizCode) {
        PolymerizeAttachmentDO polymerizeAttachmentDO = PolymerizeAttachmentDO.builder()
                .bizId(bizId)
                .bizCode(bizCode)
                .status(AttachmentStatusEnum.NORMAL_STATUS.getValue())
                .build();
        List<PolymerizeAttachmentDO> list = polymerizeAttachmentMapper.select(polymerizeAttachmentDO);
        List<PolymerizeAttachmentDTO> result = dealPolymerizeAttachment(list);
        return AppDataResult.success(result);
    }


    public String getFileDownloadUrl(String fileKey) {
        if (StringUtils.isBlank(fileKey)) {
            return null;
        }

        OSS ossClient = ossConfigProperties.getOssClient();

        // 设置URL过期时间为1小时。
        Date expiration = new Date(System.currentTimeMillis() + HOUR);
        // 生成以GET方法访问的签名URL,访客可以直接通过浏览器访问相关内容。
        URL url = ossClient.generatePresignedUrl(ossConfigProperties.getBucketName(), fileKey, expiration);

        ossClient.shutdown();
        return url.toString().replaceFirst("http", "https");
    }
相关实践学习
借助OSS搭建在线教育视频课程分享网站
本教程介绍如何基于云服务器ECS和对象存储OSS,搭建一个在线教育视频课程分享网站。
目录
相关文章
|
1月前
|
存储 人工智能 开发工具
AI场景下的对象存储OSS数据管理实践
本文介绍了对象存储(OSS)在AI业务中的应用与实践。内容涵盖四个方面:1) 对象存储作为AI数据基石,因其低成本和高弹性成为云上数据存储首选;2) AI场景下的对象存储实践方案,包括数据获取、预处理、训练及推理阶段的具体使用方法;3) 国内主要区域的默认吞吐量提升至100Gbps,优化了大数据量下的带宽需求;4) 常用工具介绍,如OSSutil、ossfs、Python SDK等,帮助用户高效管理数据。重点讲解了OSS在AI训练和推理中的性能优化措施,以及不同工具的特点和应用场景。
89 10
|
1月前
|
弹性计算 人工智能 数据管理
AI场景下的对象存储OSS数据管理实践
本文介绍了ECS和OSS的操作流程,分为两大部分。第一部分详细讲解了ECS的登录、密码重置、安全组设置及OSSUTIL工具的安装与配置,通过实验创建并管理存储桶,上传下载文件,确保资源及时释放。第二部分则聚焦于OSSFS工具的应用,演示如何将对象存储挂载为磁盘,进行大文件加载与模型训练,强调环境搭建(如Conda环境)及依赖安装步骤,确保实验结束后正确清理AccessKey和相关资源。整个过程注重操作细节与安全性,帮助用户高效利用云资源完成实验任务。
88 10
|
7天前
|
存储 人工智能 数据管理
云端问道17期方案教学-AI场景下的对象存储OSS数据管理实践
本文介绍了AI场景下的对象存储OSS数据管理实践,由阿里云技术专家明锦分享。主要内容分为两部分:1) AI场景下对象存储实践方案,包括对象存储的应用、优势及在模型推理中的优化;2) OSS常用工具介绍,如OSSFS、Python SDK、Go SDK等,并详细说明了这些工具的特点和使用场景。文中还探讨了不同模式下的性能优化,以及即将推出的OS Connector for AI/ML工具,旨在提升数据下载速度和IO性能。
|
2月前
|
弹性计算 数据管理 应用服务中间件
活动实践 | 借助OSS搭建在线教育视频课程分享网站
本教程指导用户在阿里云ECS实例上搭建在线教育网站,包括重置ECS密码、配置安全组、安装Nginx、创建网站页面、上传数据至OSS、开通OSS传输加速、配置生命周期策略及清理资源等步骤,实现高效、低成本的数据管理和网站运营。
活动实践 | 借助OSS搭建在线教育视频课程分享网站
|
6月前
|
机器学习/深度学习 人工智能 专有云
人工智能平台PAI使用问题之怎么将DLC的数据写入到另一个阿里云主账号的OSS中
阿里云人工智能平台PAI是一个功能强大、易于使用的AI开发平台,旨在降低AI开发门槛,加速创新,助力企业和开发者高效构建、部署和管理人工智能应用。其中包含了一系列相互协同的产品与服务,共同构成一个完整的人工智能开发与应用生态系统。以下是对PAI产品使用合集的概述,涵盖数据处理、模型开发、训练加速、模型部署及管理等多个环节。
|
2月前
|
分布式计算 Java 开发工具
阿里云MaxCompute-XGBoost on Spark 极限梯度提升算法的分布式训练与模型持久化oss的实现与代码浅析
本文介绍了XGBoost在MaxCompute+OSS架构下模型持久化遇到的问题及其解决方案。首先简要介绍了XGBoost的特点和应用场景,随后详细描述了客户在将XGBoost on Spark任务从HDFS迁移到OSS时遇到的异常情况。通过分析异常堆栈和源代码,发现使用的`nativeBooster.saveModel`方法不支持OSS路径,而使用`write.overwrite().save`方法则能成功保存模型。最后提供了完整的Scala代码示例、Maven配置和提交命令,帮助用户顺利迁移模型存储路径。
|
5月前
|
存储 机器学习/深度学习 弹性计算
阿里云EMR数据湖文件系统问题之OSS-HDFS全托管服务的问题如何解决
阿里云EMR数据湖文件系统问题之OSS-HDFS全托管服务的问题如何解决
|
6月前
|
消息中间件 分布式计算 DataWorks
DataWorks产品使用合集之如何使用Python和阿里云SDK读取OSS中的文件
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
6月前
|
存储 运维 安全
阿里云OSS的优势
【7月更文挑战第19天】阿里云OSS的优势
257 2
|
6月前
|
存储 API 开发工具
阿里云OSS
【7月更文挑战第19天】阿里云OSS
232 1

热门文章

最新文章