阿里云oss分片上传示例

这篇具有很好参考价值的文章主要介绍了阿里云oss分片上传示例。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

oss文件服务器分片上传官方文档参考: 分片上传 - 对象存储 OSS - 阿里云
官方文档写的更加详细,更多内容请参考官方文档

oss分片上传流程

1.初始化分片事件,向oss服务器获取全局唯一的uploadId
  • 获取uploadId,后续分片都需带上uploadId,标识同一个文件对象。
  • 另外初始化操作时已经指定文件访问链接,还可以添加一些请求头,如缓存、文件私有访问控制等条件。*
2.开始切片上传
  • 分片一般由前端完成,通过后端将分片上传到oss服务器,上传时也无需按照顺序上传。
  • 也可由前端直接上传到oss服务器,此时后端仅需要向前端颁发凭证即可。
  • 需要注意的是,在分片上传成功后需保存响应数据,留待第三步使用。*
3.分片上传完成,合并上传
  • 分片上传完成后,需主动通知oss服务器合并文件。*

2.代码示例

开始前准备
依赖导入
<dependency>
    <groupId>com.aliyun.oss</groupId>
    <artifactId>aliyun-sdk-oss</artifactId>
    <version>3.13.2</version>
</dependency> 
sql
  • 文件上传记录表
CREATE TABLE `file_upload_record` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `filename` varchar(255) DEFAULT NULL COMMENT '文件原名称',
  `md5` varchar(255) DEFAULT NULL COMMENT 'md5',
  `upload_id` varchar(255) DEFAULT NULL COMMENT 'uploadId',
  `paths` varchar(255) DEFAULT NULL COMMENT '图片地址',
  `status` varchar(255) DEFAULT NULL COMMENT '状态:wait/succ',
  `upload_start_time` datetime DEFAULT NULL COMMENT '上传起始时间',
  `upload_end_time` datetime DEFAULT NULL COMMENT '上传结束时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=39 DEFAULT CHARSET=utf8;
  • 分片上传结果记录表
CREATE TABLE `part_upload_record` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `upload_id` varchar(255) DEFAULT NULL COMMENT '唯一上传id',
  `part_number` int(11) DEFAULT NULL COMMENT '当前片数',
  `md5` varchar(255) DEFAULT NULL COMMENT '当前片的md5值',
  `upload_result` varchar(255) DEFAULT NULL COMMENT '分片上传结果(json)',
  `upload_time` datetime DEFAULT NULL COMMENT '分片上传时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=95 DEFAULT CHARSET=utf8;
请求对象
@Data
@ApiModel("分片上传实体")
public class MultipartUploadDto {
    /**
     * 唯一上传id
     */
    @ApiModelProperty(value = "分片上传id",required = true)
    @NotBlank(message = "上传id不能为空")
    private String uploadId;
    /**
     * 当前片数
     */
    @ApiModelProperty(value = "当前片数",required = true)
    @NotNull(message = "当前片数不能为空")
    private int partNumber;
    /**
     * 当前片大小
     */
    @ApiModelProperty(value = "当前片大小",required = true)
    @NotNull(message = "当前片大小不能为空")
    private long partSize;
    /**
     * 总片数
     */
    @ApiModelProperty(value = "总片数",required = true)
    @NotNull(message = "总片数不能为空")
    private int totalPart;
    /**
     * 当前片的md5值
     */
    @ApiModelProperty(value = "当前片的md5")
    private String md5;
    /**
     * 文件
     */
    @ApiModelProperty(value = "当前片文件",required = true)
    @NotNull(message = "文件不能为空")
    private MultipartFile file;
}
获取uploadId
1.初始化 ossClient
  {
        // 创建OSSClient实例。
        ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

    }
2.获取uploadId
/**
     * 获取文件上传id
     * @param fileName 文件名称
     * @return r
     */
    public UploadIdRespDto getUploadId(String fileName) {
        // 文件名称
        String objectName = "multipart" + "/" + UUID.randomUUID().toString().replaceAll("-", "") + "." + getFileExtName(fileName);
        ObjectMetadata metadata = new ObjectMetadata();
        metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());
//        //指定该Object的网页缓存行为。
        metadata.setCacheControl("no-cache");
        //设置文件为私有
        metadata.setObjectAcl(CannedAccessControlList.Private);
//        //指定该Object被下载时的名称。
        metadata.setContentDisposition("attachment;filename=" + fileName);
        // 创建InitiateMultipartUploadRequest对象。
        InitiateMultipartUploadRequest request = new InitiateMultipartUploadRequest(bucketName, objectName);
        // 初始化分片。
        InitiateMultipartUploadResult upResult = ossClient.initiateMultipartUpload(request);
        uploadService.addFileUploadRecord(upResult.getUploadId(), objectName, fileName);
        // 返回uploadId,它是分片上传事件的唯一标识。您可以根据该uploadId发起相关的操作,例如取消分片上传、查询分片上传等。
        log.info("获取uploadId成功,结果:{}", upResult);
        return UploadIdRespDto.builder()
                .uploadId(upResult.getUploadId())
                .paths(objectName)
                .prefix("https://" + bucketName + "." + endpoint.substring(8))
                .build();
    }
分片上传
    public MultipartUploadRespDto partUpload(MultipartUploadDto param) {
        String uploadId = param.getUploadId();
        // int total = param.getTotalPart();
        StopWatch st = new StopWatch();
        st.start();
        //封装分片上传请求
        UploadPartRequest uploadPartRequest = new UploadPartRequest();
        uploadPartRequest.setUploadId(param.getUploadId());
        //part大小 1-10000
        uploadPartRequest.setPartNumber(param.getPartNumber());
        uploadPartRequest.setPartSize(param.getPartSize());
        uploadPartRequest.setBucketName(bucketName);
        try {
            uploadPartRequest.setInputStream(param.getFile().getInputStream());
        } catch (IOException e) {
            throw new BusinessException("文件流异常");
        }

        FileUploadRecordEo uploadRecordEo = uploadService.findFileByUploadId(uploadId);
        if (uploadRecordEo == null) {
            throw new BusinessException("上传标识符异常!");
        }
        String objectName = uploadRecordEo.getPaths();
        uploadPartRequest.setKey(objectName);
        //查询该分片是否已上传
        boolean existPartNumber = uploadService.isExistPartNumber(uploadId, uploadPartRequest.getPartNumber());
        if (existPartNumber) {
            return MultipartUploadRespDto.builder().isUpload(1)
                    .partNumber(uploadPartRequest.getPartNumber())
                    .uploadId(uploadPartRequest.getUploadId())
                    .build();
        }
        // 每个分片不需要按顺序上传,甚至可以在不同客户端上传,OSS会按照分片号排序组成完整的文件。
        UploadPartResult uploadPartResult = null;
        try {
            uploadPartResult = ossClient.uploadPart(uploadPartRequest);
        } catch (OSSException e) {
            e.printStackTrace();
            throw new BusinessException("上传失败:" + e.getMessage());
        } catch (com.aliyun.oss.ClientException e) {
            e.printStackTrace();
            throw new BusinessException("上传失败,客户端错误:" + e.getMessage());
        }
        st.stop();
        log.info("{}文件第 {} 片上传成功,上传结果:{},耗时:{}", uploadId, uploadPartRequest.getPartNumber(), JSON.toJSON(uploadPartResult), st.getTotalTimeMillis());
        //保留分片上传接口
        uploadService.addPartUploadRecord(uploadPartResult.getPartETag(), param);
        //主动合并
//        List<PartETag> partTagList = uploadService.findPartTagListByUploadId(uploadId);
//
//        if (partTagList.size() == total) {
//            //上传成功
//            // 创建CompleteMultipartUploadRequest对象。
//            // 在执行完成分片上传操作时,需要提供所有有效的partETags。OSS收到提交的partETags后,会逐一验证每个分片的有效性。
//            // 当所有的数据分片验证通过后,OSS将把这些分片组合成一个完整的文件。
//            mergeMultipart(uploadId, objectName, partTagList);
//            uploadService.updateFileUpload(uploadId);
//        }


        return MultipartUploadRespDto.builder().isUpload(1)
                .partNumber(uploadPartRequest.getPartNumber())
                .uploadId(uploadPartRequest.getUploadId())
                .build();
    }
合并上传
    private CompleteMultipartUploadResult mergeMultipart(String uploadId, String objectName, List<PartETag> partTagList) {
        try {
            StopWatch st = new StopWatch();
            st.start();
            CompleteMultipartUploadRequest completeMultipartUploadRequest =
                    new CompleteMultipartUploadRequest(bucketName, objectName, uploadId, partTagList);
            log.info("{}文件上传完成,开始合并,partList:{}", uploadId, JSON.toJSON(partTagList));
            // 完成分片上传。

            CompleteMultipartUploadResult completeMultipartUploadResult = ossClient.completeMultipartUpload(completeMultipartUploadRequest);
            st.stop();
            log.info("{}文件上传完成,上传结果:{},耗时:{}", uploadId, JSON.toJSON(completeMultipartUploadResult), st.getTotalTimeMillis());
            return completeMultipartUploadResult;
        } catch (OSSException e) {
            e.printStackTrace();
            throw new BusinessException("合并失败:" + e.getMessage());
        } catch (com.aliyun.oss.ClientException e) {
            e.printStackTrace();
            throw new BusinessException("合并失败,客户端异常:" + e.getMessage());
        }
    }

    public CompleteMultipartUploadResult completeMultipartUpload(String uploadId) {
        FileUploadRecordEo uploadRecordEo = uploadService.findFileByUploadId(uploadId);
        if (uploadRecordEo == null) {
            throw new BusinessException("上传标识符异常!");
        }
        List<PartETag> partTagList = uploadService.findPartTagListByUploadId(uploadId);
        uploadService.updateFileUpload(uploadId);
        return mergeMultipart(uploadId, uploadRecordEo.getPaths(), partTagList);
    }

其他说明(视频截帧)

oss服务器提供了视频截帧功能,只需要在视频连接后拼上一段参数就能获取视频封面,
x-oss-process=video/snapshot,t_1000,f_jpg,w_0,h_0,m_fast,ar_auto
参数说明:
oss分片上传,阿里云,前端,服务器,java
原始文档地址: 视频截帧
另外需要注意是,视频截帧功能是收费的,收费标准请参考oss收费标准文章来源地址https://www.toymoban.com/news/detail-599864.html

前端组件参考:前端大文件上传 - 分片上传

到了这里,关于阿里云oss分片上传示例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux服务器上传文件到阿里云oss对象存储的两种方法ossutil、curl

    ossutil支持在Windows、Linux、macOS等系统中运行,您可以根据实际环境下载和安装合适的版本。 安装过程中,需要使用解压工具(unzip、7z)解压软件包,请提前安装其中的一个解压工具。 yum -y install unzip Linux系统一键安装 sudo -v ; curl https://gosspublic.alicdn.com/ossutil/install.sh | sudo b

    2024年02月13日
    浏览(44)
  • 一步步带你实现一个简单的express服务器,能让vue通过axios请求将图片上传到阿里云OSS

    上篇文章提到了如何用mock.js来模拟接口,方便在后端没有写好接口的时候也能顺利开发,本来计划这篇文章是讲一下用轮播图组件swiper来展示一下模拟接收到的数据和图片,但项目计划发生了变化,这个就推到后面再说。 mock模拟接口虽然很好用,但是在项目开发的时候还是

    2024年02月04日
    浏览(46)
  • Spring Cloud Feign MultipartFile文件上传踩坑之路(包含前端文件上传请求、后端文件保存到aliyun-oss文件服务器)

    文件上传组件用的是ant-design的a-upload组件,我的界面如下所示: 文件上传请求API: FileUtils.js 需要注意的只有FileUtils.js定义的uploadApi请求函数,其中 URL 为后端请求接口(“/imageConvert/upload”),文件上传方法必须定义为 POST ,在 headers 加入’Content-type’: ‘multipart/form-data’,后端

    2024年02月12日
    浏览(33)
  • 阿里云OSS上传视频,可分片上传

    uniappH5实现 阿里云OSS上传视频  示例图: 上传视频完整示例代码: 使用npm安装SDK开发包,安装命令为 accessKeyId 和 accessKeySecret 还有 bucket 替换成你的就行。 multipartUpload 的第一个入参是: 文件路径 + 文件名称 第二个入参是文件对象

    2024年02月01日
    浏览(24)
  • spring boot 阿里云oss 文件分片上传、断点续传

    文章目录 前言 一、申请阿里云oss 二、上代码 总结       阿里云对象存储OSS(Object Storage Service)是一款海量、安全、低成本、高可靠的云存储服务,可提供99.9999999999%(12个9)的数据持久性,99.995%的数据可用性。多种存储类型供选择,全面优化存储成本。     您可以使用阿

    2024年02月07日
    浏览(38)
  • vue3 - 使用element-plus组件库el-upload上传超大mp4视频分片上传,Upload上传大文件mp4视频进行切片分段上传到后端服务器教程,vue3如何上传很大的视频(详细示例代码

    在vue3+elementPlus中,使用el-upload组件\\\"切片分段\\\"上传mp4大视频到服务器,支持任意大视频、大文档、大压缩包等超大文件,通用方法将其拆分成多个小段进行逐个逐条上传到后端(支持断点续传、下载预览)。 详细大文件分片功能源码,可只拿前端源码或只拿springboot(Java)后

    2024年03月16日
    浏览(55)
  • 大文件上传阿里云oss,分片、断点续传进度条展示

    前端页面展示 大文件如果不采用分片上传会导致卡死、内存占用过高导致程序奔溃等一些列问题。 通常在文件大于100 MB的情况下,建议采用分片上传的方法,通过断点续传和重试,提高上传成功率。如果在文件小于100 MB的情况下使用分片上传,且partSize设置不合理的情况下,

    2024年02月11日
    浏览(34)
  • 阿里云服务器怎么正确使用OSS内网地址?

    很多客户回租用阿里云服务器,那么阿里云服务器怎么正确使用OSS内网地址?当您通过OSS内网地址访问OSS资源时,不收取流量费用。本文介绍ECS实例如何通过OSS内网地址访问OSS资源。 通过OSS内网地址访问OSS资源有以下两种方式: 与OSS同地域ECS实例可以直接通过内网访问有权

    2024年02月13日
    浏览(32)
  • Java实现Fast DFS、服务器、OSS上传

    支持Fast DFS、服务器、OSS等上传方式 在实际的业务中,可以根据客户的需求设置不同的文件上传需求,支持普通服务器上传+分布式上传(Fast DFS)+云服务上传OSS(OSS) 为了方便演示使用,本项目使用的是前后端不分离的架构 前端:Jquery.uploadFile 后端:SpringBoot 前期准备:F

    2024年04月08日
    浏览(36)
  • 若依OSS如何支持本地上传,保存到服务器本地?

    SysOssController改动: ISysOssService改动: SysOssServiceImpl 改动: OssClient改动: windows配置: linux配置: 记得修改your.domain:8080为你自己服务器的接口ip或域名和端口。 数据示例:

    2024年04月16日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包