uploadCloud.ets
4.0 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
import fs from '@ohos.file.fs';
import { request, BusinessError } from '@kit.BasicServicesKit';
import { promptAction } from '@kit.ArkUI'
import { photoAccessHelper } from '@kit.MediaLibraryKit'
import { getCosKey, cosKeyTest, cosKeyData, uploadVideoOrImg } from '../api/cosKey'
import { AxiosResponse } from '@ohos/axios'
// 选择一张图片或视频
export async function selectImgOrVideo(){
// 1. 创建参数对象
const opts = new photoAccessHelper.PhotoSelectOptions() // 创建参数对象
opts.MIMEType = photoAccessHelper.PhotoViewMIMETypes.IMAGE_VIDEO_TYPE // 设置MIME类型
opts.maxSelectNumber = 1 // 设置最大选择数量
// 2. 创建选择器对象
const photoPicker = new photoAccessHelper.PhotoViewPicker() // 创建选择器对象
const photos = await photoPicker.select(opts) // 选择文件
return photos.photoUris[0] // 返回文件路径
}
/**
* 上传文件(通过uploadTask实现)
* @param context context
* @param media 媒体文件
*/
export async function uploadFileByTask(cosKeyStr: string, relateId: number, systemPhotoImagePath: string) {
let fileArr = systemPhotoImagePath.split('/')
let index = fileArr.length - 1
let filenames = fileArr[index] // 设置文件名称
// 获取直传签名等数据
let ext = filenames.split('.')[1] // 文件后缀
let filename = Date.now() + '.' + ext // 设置图片名称
let directTransferResult: AxiosResponse<cosKeyTest> = await getCosKey(filename);
let directTransferData: cosKeyData = directTransferResult.data.data
if (directTransferData == null) {
promptAction.showToast({ message: 'getStsDirectSign fail' });
return;
}
let cosKey = directTransferData.coskey
// 生成上传的url
let url = directTransferData.preSignedUrl
try {
let cacheDir = getContext().cacheDir // 获取缓存目录
let fullPath = cacheDir + '/' + filename // 设置图片路径
const file = fs.openSync(systemPhotoImagePath, fs.OpenMode.READ_ONLY) // 打开图片
// 复制uri文件到cacheDir(因为request.uploadFile只接受internal:类型的路径)
fs.copyFileSync(file.fd, fullPath) // 复制图片
// 开始上传
try {
let uploadTask = await request.uploadFile(getContext(),{ // 上传图片
url: url, // 请求地址
// 请求头
header:{
"Content-Type": "application/octet-stream"
},
method: "PUT",
files:[{ // 上传文件
filename: filename, // 文件名
type: ext, // 文件扩展名
name:'file', // 接口参数名
uri:`internal://cache/${filename}` // 缓存目录中的要上传给服务器的图片路径
}],
data:[]
})
// 成功后响应
uploadTask.on('progress', (uploadSize, totalSize) => {
console.log('上传进度--->', uploadSize, totalSize)
});
// 上传成功
uploadTask.on('complete', async (taskStates: Array<request.TaskState>) => {
for (let i = 0; i < taskStates.length; i++) {
let cosKeyArr: string[] = []
if(cosKeyStr !== '') {
cosKeyArr = cosKeyStr.split(';')
}
cosKeyArr.push(cosKey)
console.log('cosKeyArr--->', cosKeyArr.join(';'), relateId)
await uploadVideoOrImg({ cosKey: cosKeyArr.join(';'), relateId: relateId })
promptAction.showToast({ message: '上传成功' });
}
});
// 上传失败
uploadTask.on('fail', (taskStates: Array<request.TaskState>) => {
for (let i = 0; i < taskStates.length; i++) {
promptAction.showToast({ message: '上传失败' });
}
});
} catch (error) {
let err: BusinessError = error as BusinessError;
console.error(`Invoke uploadFile failed, code is ${err.code}, message is ${err.message}`);
}
} catch (err) {
console.info("uploadFile Error sending PUT request: " + JSON.stringify(err));
promptAction.showToast({ message: "uploadFile Error sending PUT request: " + JSON.stringify(err) });
}
}