HarmonyOS鸿蒙Next文件上传
HarmonyOS鸿蒙Next文件上传 我这边从相册里已经拿到了路径了: file://media/Photo/6/IMG_1712626998_005/screenshot_20240409_094137.jpg 然后网络请求框架用的axios,然后不知道怎么把这个路径转成file去上传,axios框架里说是用arrayBuffer,和uri (internal://cache)这种类型,这种uri不知道怎么获取,arrayBuffer我按照文档上的去转换,貌似转出来是个空的,不知道能否提供一个选择文件之后开始上传文件的demo呢?
头像上传
// 获取到相册选择图片的URI const PERMISSIONS: Array<Permissions> = [ ‘ohos.permission.READ_MEDIA’, ‘ohos.permission.WRITE_MEDIA’ ];
let context = getContext(this) as common.UIAbilityContext; let atManager = abilityAccessCtrl.createAtManager();
await atManager.requestPermissionsFromUser(context, PERMISSIONS);
const photoSelectOption = new picker.PhotoSelectOptions(); photoSelectOption.MIMEType = picker.PhotoViewMIMETypes.IMAGE_TYPE; photoSelectOption.maxSelectNumber = 2;
const photoViewPicker = new picker.PhotoViewPicker();
photoViewPicker.select(photoSelectOption)
.then(async (photoSelectResult) => {
this.uris = photoSelectResult.photoUris;
})
.catch((err: BusinessError) => {
console.info(Invoke photoViewPicker.select failed, code is ${err.code}, message is ${err.message}
);
});
// axios上传类型支持uri和ArrayBuffer
// 转化为internal://cache
fs.open(this.uris[0], fs.OpenMode.READ_ONLY)
.then((file) => { // READ_ONLY READ_WRITE
let newPath = this.context.cacheDir + /test.png
;
fs.copyFile(file.fd, newPath)
.then(() => {
console.info(“applog: copy file succeed”);
let realUri = “internal://cache/” + newPath.split(“cache/”)[1];
console.log('realUri: ’ + JSON.stringify(realUri));
})
.catch((err: BusinessError) => {
console.info("applog: copy file failed with error message: " + err.message + ", error code: " + err.code);
});
})
.catch((err: BusinessError) => {
console.info("applog: open file failed with error message: " + err.message + ", error code: " + err.code);
});
// 转化为ArrayBuffer let file = fs.openSync(this.uris[0], fs.OpenMode.READ_ONLY); const imageSource = image.createImageSource(file.fd); fs.closeSync(file);
const imagePackApi = image.createImagePacker(); let packOpts: image.PackingOption = { format: “image/png”, quality: 100 };
imagePackApi.packing(imageSource, packOpts) .then(readBuffer => { let bufferArr = new Uint8Array(readBuffer); console.log('bufferArr: ’ + JSON.stringify(bufferArr)); });
// 复制文件 let file = fs.openSync(this.uris[0], fs.OpenMode.READ_ONLY); let file2 = fs.openSync(this.filesDir + ‘/test.jpg’, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE); fs.copyFileSync(file.fd, file2.fd); // 先创建有读写权限的文件,再把不可读写的文件复制过来
fs.closeSync(file); fs.closeSync(file2);
更多关于HarmonyOS鸿蒙Next文件上传的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
将图片的url, 转换为arrayBuffer
transitionImage2Buffer(uri: string): ArrayBuffer {
// 读取图片为buffer
const file = fs.openSync(uri, fs.OpenMode.READ_ONLY);
this.photoSize = fs.statSync(file.fd).size;
let imageArraybuffer = new ArrayBuffer(this.photoSize);
fs.readSync(file.fd, imageArraybuffer);
fs.closeSync(file);
return imageArraybuffer
}
axios 有 upload 的demo
https://ohpm.openharmony.cn/#/cn/detail/
HarmonyOS鸿蒙Next中的文件上传功能主要通过ohos.file.fs
和ohos.file.upload
模块实现。ohos.file.fs
模块提供了文件系统操作的基本接口,如文件读取、写入、删除等。ohos.file.upload
模块则专门用于文件上传,支持多线程上传、断点续传、上传进度监控等功能。
在HarmonyOS鸿蒙Next中,文件上传的典型流程如下:
- 获取文件:使用
ohos.file.fs
模块的接口获取要上传的文件。 - 创建上传任务:通过
ohos.file.upload
模块的UploadTask
类创建上传任务,设置上传的URL、文件路径、请求头等参数。 - 启动上传:调用
UploadTask
的start
方法启动上传任务。 - 监控上传进度:通过
UploadTask
的onProgress
回调方法实时监控上传进度。 - 处理上传结果:通过
UploadTask
的onComplete
和onError
回调方法处理上传成功或失败的情况。
ohos.file.upload
模块还支持上传任务的暂停、恢复和取消操作,适用于需要灵活控制上传过程的场景。
在HarmonyOS鸿蒙Next中,文件上传可以通过ohos.file.fs
模块或@ohos.net.http
模块实现。使用ohos.file.fs
可以读取本地文件,而@ohos.net.http
则用于HTTP请求。首先,获取文件路径并读取文件内容,然后通过HTTP请求将文件数据上传到服务器。具体步骤包括:
- 使用
fs.openSync
打开文件; - 使用
fs.readSync
读取文件数据; - 使用
http.createHttp
创建HTTP请求; - 设置请求头并发送数据。
确保处理异步操作和错误捕获。