【HarmonyOS NEXT】使用picker组件从相册获取到图片之后存储到沙盒中,图片无法使用

 【关键字】

FilePicker / 保存图片 / 加载图片

【问题描述】

通过@ohos.file.picker选图后,通过fs将图片写入到沙盒中,图片无法使用

divice file browser中存在该图片文件,但是破损无法使用

代码如下:

//第一步picker选图:
pickImageInAlbum(photoSelectOptions: picker.PhotoSelectOptions): Promise<picker.PhotoSelectResult> {
return new Promise((resolve, reject) => {
try {
let photoPicker = new picker.PhotoViewPicker();
photoPicker.select(photoSelectOptions).then((PhotoSelectResult: picker.PhotoSelectResult) => {
resolve(PhotoSelectResult)
}).catch((err: BusinessError) => {
reject(err)
});
} catch (error) {
let err: BusinessError = error as BusinessError;
reject(err)
}
})
}
let PhotoSelectOptions = new picker.PhotoSelectOptions();
PhotoSelectOptions.MIMEType = picker.PhotoViewMIMETypes.IMAGE_TYPE;
PhotoSelectOptions.maxSelectNumber = params.count;
//第二步,写入图片:
const result: picker.PhotoSelectResult = await this.pickImageInAlbum(PhotoSelectOptions)
const isOriginalPhoto: boolean = result.isOriginalPhoto
const photo = result.photoUris[0]
const pixelMap = await this.getThumbnail(asset)
let pixelBytesNumber = pixelMap.getPixelBytesNumber();
const readBuffer = new ArrayBuffer(pixelBytesNumber);
pixelMap.readPixelsToBuffer(readBuffer).then(() => {
let pixelmapArrayBuffer: ArrayBuffer = readBuffer;
let filesDir: string = getContext(ImageCtor.mContext).filesDir
let filePath = filesDir + "/xxxxcc.jpg";
let file = fs.openSync(filePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
fs.writeSync(file.fd, pixelmapArrayBuffer);
fs.fsyncSync(file.fd);
const res = fs.accessSync(filePath)
fs.closeSync(file);
})

【解决方案】

参考如下文档实现保存文件:

https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/save-user-file-0000001774120434

参考Demo如下:

saveImage() {
let uris: Array<string> = [];
const photoSelectOptions = new picker.PhotoSelectOptions();
photoSelectOptions.MIMEType = picker.PhotoViewMIMETypes.IMAGE_TYPE; // 过滤选择媒体文件类型为IMAGE
photoSelectOptions.maxSelectNumber = 5; // 选择媒体文件的最大数目
const photoViewPicker = new picker.PhotoViewPicker();
photoViewPicker.select(photoSelectOptions).then(async (photoSelectResult: picker.PhotoSelectResult) => {
uris = photoSelectResult.photoUris;
console.info('photoViewPicker.select to file succeed and uris are:' + uris);
let context = getContext(this);
let file1 = fs.openSync(uris[0], fs.OpenMode.READ_ONLY);
fs.stat(file1.fd).then((stat: fs.Stat) => {
console.info("get file info succeed, the size of file is " + stat.size);
let buffer = new ArrayBuffer(stat.size);
let readLen = fs.readSync(file1.fd, buffer);
let filePath = context.filesDir + "/test.png";
console.log("testTag-filePath:" + filePath);
let file = fs.openSync(filePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
let writeLen = fs.writeSync(file.fd, buffer);
console.info("testTag-write data to file succeed and size is:" + writeLen);
fs.closeSync(file);
}).catch((err: BusinessError) => {
console.error("get file info failed with error message: " + err.message + ", error code: " + err.code);
});
})
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值