阿里云oss文件分片、断点续传上传

1、概述

把文件上传到阿里云oss上有两种上传方案:
(1) 表单提交
(2)阿里云sdk
表单提交操作简单只需要向bucket所在地址发起post请求,并携带上签名,具体的可以由javaScript在前端生成,或者是由自己项目服务端生成,上传文件时需要先获取签名然后再携带上签名的参数向oss服务器上传文件。表单操作便捷,但有三大痛点,第一点是它不支持断点重传,第二它不支持分片上传,第三,它对批量上传不太友好,我曾经实践过,使用表单提交获取的签名只能使用一次,要想通过表单提交来实现批量上传,说白了就是要上传每一个文件时都要先去获取签名,然后再向oss服务器发起一次新的post请求.
吐槽完了表单提交,再来说说今天的主角阿里云sdk,它支持分片上传和断点续传更加适合真实项目的使用场景。其次对于当前的前后端分离架构文件上传的安全问题,阿里云sdk的解决方案是STS临时访问令牌,这个访问令牌是临时性的,每一次生成都是不同的,并且可以设置过期时间,且前端可以缓存起来重复利用的。它的安全性也是更高的,STS生成的流程是:应用服务器携带者直接身份信息去请求阿里云的STS服务器,STS服务器生成临时访问令牌返回给应用服务器,应用服务器再将令牌以及bucket信息封装返回给前端,前端在再拿着应用服务器返回的令牌去操作oss服务器上文件。
ok,流程捋完,开始动手实践。

2、创建RAM用户 角色 权限策略

(1) 进入到oss控制台点击权限管理
(2)点击前往控制套进入到RAM管理控制台

在这里插入图片描述
(3) 选择用户模块,创建新的用户
在这里插入图片描述
(4)输入用户名,重点是勾上 Open API调用访问
在这里插入图片描述
(5) 点击确定后将出现如下界面
在这里插入图片描述
(6)保存AccessKey Id 和 AccessKey Secret
可以直接保存到后端的配置文件里,待会获得STS Token 的时候要用到。
保存之后点击返回。
(7) 选择角色模块,点击创建新的角色
在这里插入图片描述
此时将会出现如图界面
在这里插入图片描述
选择可信实体类型为 阿里云账号,点击下一步。输入角色名称,点击完成即可。
在这里插入图片描述
找到刚刚创建的角色,点击角色名,将会看到如下页面,需要保存ARN,同前面的AccessKey 一样需要在获取令牌的时候用到。
在这里插入图片描述

(8)创建允许上传文件的权限。 进入权限策略管理,点击创建权限策略,输入策略名称,选择脚本配置,脚本内容可参考。

    "Version": "1",
    "Statement": [
     {
           "Effect": "Allow",
           "Action": [
             "oss:PutObject"
           ],
           "Resource": [
             "acs:oss:*:*:examplebucket/exampledir",
             "acs:oss:*:*:examplebucket/exampledir/*"
           ]
     }
    ]
}

在这里插入图片描述
配置完脚本文件后,点击确认并返回
(9) 为用户和角色分配权限
进入到用户模块,点击刚刚创建的用户对用的添加权限
在这里插入图片描述
将会出现如下界面
在这里插入图片描述

搜索sts,点击AliyunSTSAssumRoleAccess ,它将会出现在已选择的框中,点击确定。

进入到角色模块,找到刚刚创建的角色,点击添加权限
在这里插入图片描述
和为用户分配权健的界面相同,选择自定义策略,添加刚刚创建的策略。
在这里插入图片描述
总结一下,就是需要一个RAM用户一个角色,一个允许文件上传到对应bucket的权限策略,在请求token的时候需要带上accessKeyId和accessKeySecret相当于RAM的账号密码,同时需要带上角色名和角色ARN,通过角色来为token 授予bucket的访问权限;

2.应用服务端向STS服务器请求Token

如果是SpringBoot项目的话需要引入依赖:

<dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>aliyun-java-sdk-sts</artifactId>
            <version>3.0.0</version>
        </dependency>
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>aliyun-java-sdk-core</artifactId>
            <version>4.4.6</version>
        </dependency>

如果是SpringCloud项目只需要引入:

 <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alicloud-oss</artifactId>
 </dependency>

引入了依赖之后开始编写获取StsToken的代码,首先定义一个StsToken实体,用来反馈给前端:

@Data
@Builder
public class StsTokenVo {
   

    private String region;

    private String accessKeyId;

    private String accessKeySecret;

    private String stsToken;

    private String bucket;

    private String expiration;


}

按部就班,来个Service

public interface StsTokenService {
   

    StsTokenVo getStsToken();

}
@Service
public class StsTokenServiceImpl implements StsTokenService {
   

    private static final String REGION = "oss-cn-beijing";
    private static final String BUCKET = "chiris-test";
    private static final String ENDPOINT = "sts.cn-beijing.aliyuncs.com";
    private static final String ACCESS_KEY_ID = "access key id";
    private static final String ACCESS_KEY_SECRET = 
  • 3
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
你可以使用 Element UI 和阿里云 OSS 来实现分片上传视频。首先,你需要在你的项目中引入 Element UI 组件库和阿里云 OSS 的 SDK。 然后,你可以使用 Element UI 中的上传组件来实现文件选择和上传的功能。在上传组件中,你可以设置一些参数来启用分片上传功能。例如,你可以设置 `chunkSize` 参数来指定每个分片的大小,以及 `chunkRetry` 参数来设置分片上传失败时的重试次数。 在上传过程中,你可以使用阿里云 OSS 的 SDK 来进行分片上传。你需要将视频文件切割成多个分片,并将每个分片上传阿里云 OSS 中的指定位置。可以使用 `oss.multipartUpload` 方法来实现分片上传功能。 具体的代码实现步骤如下: 1. 引入 Element UI 和阿里云 OSS 的 SDK: ```javascript import ElementUI from 'element-ui'; import 'element-ui/lib/theme-chalk/index.css'; import OSS from 'ali-oss'; ``` 2. 初始化阿里云 OSS 客户端: ```javascript const client = new OSS({ region: 'your_region', accessKeyId: 'your_access_key_id', accessKeySecret: 'your_access_key_secret', bucket: 'your_bucket_name' }); ``` 3. 在上传组件中设置分片上传参数: ```html <el-upload :action="your_upload_url" :on-success="handleSuccess" :chunk-size="your_chunk_size" :chunk-retry="your_chunk_retry" > <el-button slot="trigger">选择视频文件</el-button> </el-upload> ``` 4. 实现上传成功的回调函数: ```javascript handleSuccess(response, file, fileList) { // 在上传成功后,你可以根据需要进行后续处理,例如保存视频路径等操作 } ``` 5. 在回调函数中实现分片上传: ```javascript handleSuccess(response, file, fileList) { const { uploadId, name } = response.data; // 获取上传 ID 和文件名 const chunks = splitVideoIntoChunks(file); // 将视频文件切割成多个分片 const uploadPromises = chunks.map((chunk, index) => { return client.uploadPart(name, uploadId, index + 1, chunk); // 上传每个分片 }); Promise.all(uploadPromises) .then(results => { const etags = results.map(result => result.etag); return client.completeMultipartUpload(name, uploadId, etags); // 完成分片上传 }) .then(() => { console.log('分片上传完成'); }) .catch(error => { console.error('分片上传失败', error); }); } ``` 以上是一个简单的示例,你可以根据自己的需求进行适当调整。希望以上信息对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值