
回复
大家好,今天要分享的是在端云一体化开发中从端侧上传文件至云存储。
在端侧上传文件分为几个步骤,下面跟大家拆开说一说。
1、开通云存储服务
首先打开AGC的开发与服务页面,确认开通了云存储服务。
2、获取用户凭证
获取用户凭证主要是出于安全的考虑,有两种获取方式,我们推荐使用AGC认证服务SDK获取。
首先,在oh-package.json5文件中添加依赖并同步:
"dependencies": {
"@hw-agconnect/auth": "^1.0.5"
}
第二步,进行登录认证。登录认证有手机、邮箱、华为账号等多种方式,大家可以自行选择。这里以手机登录为例为大家演示登录认证的过程。
手机登录是以验证码的方式进行,但是86开头的手机号并不会将验证码发送到手机上,而是发送到开发者的服务器,由开发者集成短信平台自行推送短信。
首先打开AGC的认证服务,开通手机号码认证,这时会弹窗收集开发者的接收地址:
系统会以POST方式将验证码发送到您的服务器中,请求参数示例如下:
"Request Headers": {
"X-AGC-Timestamp":"1746585196948", // 时间戳
"X-AGC-Auth":"****", // 签名信息
"Content-Type":"application/json"
},
"Request Body": {
"action":"1001", // 验证码行为。1001:注册登录; 1002:重置密码; 1003:修改手机号(此种情况下,verifyCode为空 ,仅发送一个短信通知)
"phoneNumber":"+86-12345678910", // 手机号。格式为”+86-xxxxxxxxxxx”
"productId":"1234****5678", // 项目ID
"taskId":"023d579****b444bb3224ea125478545", // 任务Id
"verifyCode":"00**52" // 验证码
}
}
收到POST请求后,您需要判断时间戳是否超时和进行验签。验签的方式是"POST" + url + 时间戳 + body 。
第三步,获取AuthProvider,具体代码如下:
import { cloudCommon } from '@kit.CloudFoundationKit';
import auth from '@hw-agconnect/auth';
import { request } from '@kit.BasicServicesKit';
let authProvider = auth.getAuthProvider();
cloudCommon.init({
region: cloudCommon.CloudRegion.CHINA,
authProvider: authProvider,
functionOptions:{timeout:10*1000},
storageOptions:{mode:request.agent.Mode.BACKGROUND, network:request.agent.Network.ANY},
databaseOptions:{schema:"schema", traceId:"traceId"}
})
文章至此,我们还没有正式开始文件的上传。如果您觉得太过繁琐,在调试程序时有一个小妙招来快速进行文件的上传。
在AGC云存储的安全配置下,将凭证判断代码改为true并发布就可以跳过用户凭证的校验:
不过这样的方式仅限于程序调试阶段使用,正式上线还是要进行验证为妥。
3、上传文件
到了正式的上传文件环节就比较简单明了,首先初始化云存储实例,然后调用uploadFile接口传入本地路径和云侧路径就可以了,具体代码如下:
const bucket: cloudStorage.StorageBucket = cloudStorage.bucket();
bucket.uploadFile(getContext(this), {
localPath: cacheFilePath,
cloudPath: cloudPath,
}).then(task => {
// add task event listener
this.addEventListener(task, this.onUploadCompleted(cloudPath, cacheFilePath));
// start task
task.start();
}).catch((err: BusinessError) => {
hilog.error(HILOG_DOMAIN, TAG, 'uploadFile failed, error code: %{public}d, message: %{public}s',
err.code, err.message);
this.isUploading = false;
});