HarmonyOS 鸿蒙Next图库选择图片上传案例
HarmonyOS 鸿蒙Next图库选择图片上传案例
我在开发图库选择图片上传的功能时,在得到文件路径后使用fs模块拷贝到沙盒中进行上传,然后到
fs.openSync(options.filePath, fs.OpenMode.CREATE | fs.OpenMode.READ_WRITE);
这里就行不通了,无法将文件读取到复制进沙盒中,大家处理该场景时有遇到这个问题吗?
更多关于HarmonyOS 鸿蒙Next图库选择图片上传案例的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
参考demo:
import { BusinessError } from '[@ohos](/user/ohos).base';
import { rcp } from '[@kit](/user/kit).RemoteCommunicationKit';
import { picker } from '[@kit](/user/kit).CoreFileKit';
import fs from '[@ohos](/user/ohos).file.fs';
import { http } from '[@kit](/user/kit).NetworkKit';
let uploadUrl: string = 'http://192.168.62.4:8080/upload';
function example01(): string {
let uri = '';
let photoViewPicker = new picker.PhotoViewPicker();
let photoSelectOption = new picker.PhotoSelectOptions();
photoSelectOption.MIMEType = picker.PhotoViewMIMETypes.IMAGE_TYPE;
photoViewPicker.select(photoSelectOption).then((photoSelectResult) => {
console.log("fyh photoSelectResult:" + photoSelectResult);
uri = photoSelectResult.photoUris[0];
console.log("fyh uri:" + uri);
try {
let resultPhoto = fs.openSync(uri,fs.OpenMode.READ_ONLY);
let resultName = resultPhoto.name;
let fileTemp = fs.openSync(getContext().filesDir+resultPhoto.name,fs.OpenMode.READ_WRITE|fs.OpenMode.CREATE);
let imageUri = fileTemp.path;
fs.copyFileSync(resultPhoto.fd,fileTemp.fd);
fs.closeSync(resultPhoto);
fs.closeSync(fileTemp);
const httpRequest = http.createHttp();
httpRequest.request(uploadUrl,{
method:http.RequestMethod.POST,
header:{
'Content-Type': 'multipart/form-data',
'Connection':'keep-alive'
},
expectDataType:http.HttpDataType.ARRAY_BUFFER,
multiFormDataList: [
{
name:'file',
contentType: 'image/jpg',
filePath: imageUri,
remoteFileName:'file.jpg'
},
],
},(err,data) => {
console.log('fyh:上传结束')
httpRequest.destroy();
}
)
} catch (err) {
console.error(`fyh:Failed to request the upload. err: ${JSON.stringify(err)}`);
}
}).catch((err:BusinessError) => {
console.error(`Invoke photoViewPicker.select failed, code is ${err.code}, message is ${err.message}`);
})
return uri;
}
function testRcpMultiPartUpload() {
example01();
}
function clickget() {
const session = rcp.createSession();
session.get("http://192.168.62.4:8080/getText").then((response) => {
console.log("fyh"+JSON.stringify(response));
}).catch((err: BusinessError) => {
console.error("err:" + JSON.stringify(err));
});
}
[@Entry](/user/Entry)
[@Component](/user/Component)
struct Index {
[@State](/user/State) message: string = 'Hello World';
build() {
Row() {
Column() {
Text(this.message)
.fontSize(50)
.fontWeight(FontWeight.Bold)
.onClick(() => {
testRcpMultiPartUpload();
})
Text('getText')
.fontSize(50)
.fontWeight(FontWeight.Bold)
.onClick(() => {
clickget();
})
}
.width('100%')
}
.height('100%')
}
}
更多关于HarmonyOS 鸿蒙Next图库选择图片上传案例的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS鸿蒙系统中,实现图库选择图片并上传的功能,可以通过以下步骤进行:
-
权限声明:在
config.json
文件中声明必要的权限,如读取存储权限(ohos.permission.READ_MEDIA
)和写入存储权限(ohos.permission.WRITE_MEDIA
)。 -
启动图库选择器:使用
Intent
启动系统图库选择器,允许用户选择图片。例如,通过Intent.ACTION_PICK
动作来启动选择器,并设置数据类型为image/*
。 -
获取图片URI:在图库选择器返回后,通过
onActivityResult
方法获取用户选择的图片URI。 -
读取图片数据:使用
MediaStore
或ContentProvider
读取图片数据,可以转换为Bitmap或直接读取为字节流。 -
上传图片:根据需求,将读取到的图片数据通过HTTP请求或其他网络协议上传至服务器。
示例代码片段(省略了具体实现细节):
// 假设在Activity中
Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
intent.setType("image/*");
startActivityForResult(intent, REQUEST_CODE_PICK_IMAGE);
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_CODE_PICK_IMAGE && resultCode == RESULT_OK && data != null) {
Uri imageUri = data.getData();
// 处理图片URI,读取并上传
}
}
注意:以上代码仅为逻辑框架,具体实现需根据HarmonyOS API文档调整。如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html