Ionic Angular项目集成Imgly插件编辑后无法导出捕获图片
问题原因
代码存在4个直接导致图片导出失败的问题:
- 执行时序错误:编辑器返回结果对象后,先执行了图片处理、展示、业务回调逻辑,最后才调用
save()方法。此时编辑后的图片还未持久化写入本地存储,data1.image指向的是无效的内存临时地址,根本读取不到有效图片资源。 - 返回值认知错误:将
data1.save()返回的sceneAsString直接当作图片数据传入上传接口,但该值是编辑操作的序列化配置字符串,并非图片二进制或路径,即使上传成功也无法得到可用图片。 - API用法过时:采用旧版回调形式调用
PESDK.openEditor,新版本Imgly插件已全面适配Promise规范,回调写法在Ionic的Zone.js变更检测机制下会出现上下文丢失,导致save()方法执行后不触发对应回调。 - 分支逻辑bug:文件选择器分支仅获取了DOM元素,既未触发选择器点击事件,也没有中断后续拍照流程,会导致启用文件选择器的场景下逻辑冲突。
修复方案
直接替换原有方法实现即可:
captureImage2() { if (this.usepicker) { this.filePickerRef.nativeElement.click(); return; } const options: CaptureImageOptions = { limit: 1 }; this.mediaCapture.captureImage(options).then( async (data: MediaFile[]) => { const fullPath = data[0].fullPath; const directoryPath = fullPath.substring(0, fullPath.lastIndexOf("/")); const fileName = fullPath.substring(fullPath.lastIndexOf("/") + 1); console.log( "File Details ======>>>>>>", fullPath, directoryPath, fileName ); try { // 用Promise形式唤起编辑器,避免回调上下文丢失 const editorResult = await PESDK.openEditor(fullPath); console.log("编辑器返回结果 =====> ", JSON.stringify(editorResult)); // 先执行保存,拿到编辑后图片的有效本地路径 const exportedImagePath = await editorResult.save(); console.log("导出图片实际路径:", exportedImagePath); // 拿到有效路径后再执行后续处理、展示、业务逻辑 await this.toProcessImage(exportedImagePath); await this.displayImage(exportedImagePath); this.onButtonClick(exportedImagePath); // 解析本地沙盒路径为文件对象,转Blob用于上传 const fileEntry = await this.file.resolveLocalFilesystemUrl(exportedImagePath); const fileBlob = await new Promise<Blob>((resolve, reject) => { fileEntry.file(file => { const reader = new FileReader(); reader.onloadend = () => resolve(new Blob([reader.result], { type: 'image/jpeg' })); reader.onerror = reject; reader.readAsArrayBuffer(file); }, reject); }); // 执行上传 const fileResponse = await UriFileUpload({ file: fileBlob, fileName: `edited_${fileName}`, directory: this.dic }); if (fileResponse) { console.log("image UPLOADED", JSON.stringify(fileResponse)); this.toastSer.success("uploaded"); this.updateFiles.next(fileResponse); } else { this.toastSer.error("Somthing went wrong!"); } } catch (error) { console.error("编辑/导出/上传流程异常:", error); } }, (err: CaptureError) => console.error(err) ); }
注意事项
- 提前配置平台权限:Android端需要在
AndroidManifest.xml中声明存储读写权限,iOS端需要在Info.plist中添加相机、相册权限描述,否则会因为权限不足导致保存失败。 - 可以在调用
PESDK.openEditor时传入配置项,指定导出图片格式、压缩质量,避免导出图片体积过大影响上传速度。 - 不要直接传本地路径给上传方法,必须先通过
@ionic-native/file解析为Blob或FormData格式,避免沙盒权限导致的文件读取失败。
内容的提问来源于stack exchange,提问作者Ariyan Ashfaque
相关产品推荐
相关产品推荐

