请选择 进入手机版 | 继续访问电脑版
帖子
帖子
用户
博客
课程
12下一页
返回列表 发新帖
显示全部楼层

[插件使用] fs模块,拷贝文件copyToSync返回null

[复制链接]
发表于 2021-8-13 14:17:50
本帖最后由 云象智能科技有限公司 于 2021-9-6 12:36 编辑

使用fs模块拷贝从微信分享的文件,当文件名是中文的情况下,返回null,英文或者数字的文件名正常


测试手机:华为 Mate40 Pro,鸿蒙系统【老款的华为手机测试正常】

if (api.systemType === 'android' && ret.data) {
                    var filename = decodeURI(ret.data);   //从微信返回的content:// 协议的路径,中文文件名,decodeURI解码
                    // var filename = ret.data;   //如果不转码,ajax无法上传文件
                    var name = filename.split(".");
                    var ext = name[name.length - 1];
                    ext = ext.toLowerCase(ext);

                    if (ext == "pdf" || ext == "xls" || ext == "xlsx" || ext == "doc" || ext == "docx") {
                        var fs = api.require('fs');
                        var retCoyp = fs.copyToSync({
                            oldPath: filename,
                            newPath: "fs://../../Inbox/"
                        });


showAlert(retCoyp);
                        // var retRename = fs.renameSync({
                        //     oldPath: "fs://../../Inbox/" + filename,
                        //     newPath: "fs://../../Inbox/" + decodeURI(filename)
                        // });//备注:尝试拷贝时不转换,拷贝成功后修改文件名,测试结果是拷贝成功,改名返回成功,但是未生效

                        if (retCoyp.status) {
                          showAlert("文件拷贝成功,请在附件选择中查看");
                        }

功能背景:
需要将微信中的文件,分享到App中,作为附件上传
文件名都是中文,知道附件的文件是做什么用的,比如“项目需求.doc”,"需求清单.xsl"
以上代码,将微信分享过来的文件,拷贝到fs某目录下,app读取目录,选择附件上传。


问题说明:
1、使用老款华为手机测试正常,附件能正常上传
2、使用最新的华为手机,鸿蒙系统,文件拷贝不成功,返回值为null
3、系统报错,错误信息为“Cannot read property ‘status’of null ”,showAlert显示retCoyp为“null”
分析:无论拷贝是否成功,至少应该有返回值,现在返回值为null,说明模块内部报错导致没有返回值

以上代码使用decodeURI(ret.data),将微信返回的路径“content://.....%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90%E5%8A%9F%E8%83%BD%E6%B8%85%E5%8D%95.xls”转换为“content://.....数据分析功能清单.xls”
保存到fs某目录下



data:content://com.tencent.mm.external.fileprovider/external/Android/data/com.tencent.mm/MicroMsg/Download/%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90%E5%8A%9F%E8%83%BD%E6%B8%85%E5%8D%95.xlsx at index.html : 248

decodeURI:content://com.tencent.mm.external.fileprovider/external/Android/data/com.tencent.mm/MicroMsg/Download/数据分析功能清单.xlsx at index.html : 251


更换了个方案问题已经解决了,被这个问题折腾了好久。



微信截图_20210813184420.png
33afec80c3d93d53a149d51211a5367.jpg
deec07223f164a8f28b2ab4638eb0f8.jpg
67352d31c2f546834ae2d6d5e7c5ac6.jpg
380
帖子
4
勋章
6
Y币
需要自己处理中文的文件名
本帖最后由 云象智能科技有限公司 于 2021-8-13 15:18 编辑
技术支持-F 发表于 2021-8-13 14:52
需要自己处理中文的文件名

如何处理,尝试了不转码拷贝,然后重命名,但是拷贝成功,重命名返回成功,但是不生效
另外老款的华为手机正常,应该是华为最新款手机,或者鸿蒙系统存在兼容问题导致的,麻烦官方处理下
decodeURI(ret.data)   ret.data 这两个值发下
本帖最后由 云象智能科技有限公司 于 2021-8-13 18:28 编辑
Robot_Lee 发表于 2021-8-13 16:47
decodeURI(ret.data)   ret.data 这两个值发下

ret.data里面的文件名:%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90%E5%8A%9F%E8%83%BD%E6%B8%85%E5%8D%95.xlsx
decodeURI(ret.data)文件名:数据分析功能清单.xlsx

如果拷贝失败,至少也应该有返回值的
if (retCoyp.status) {
                          showAlert("文件拷贝成功,请在附件选择中查看");
                        }


现在报错了,因为返回值retCoyp是null,说明模块内部遇到了bug,导致无法正常返回。


云象智能科技有限公司 发表于 2021-8-13 18:20
ret.data里面的文件名:%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90%E5%8A%9F%E8%83%BD%E6%B8%85%E ...

完整路径发下

data:content://com.tencent.mm.external.fileprovider/external/Android/data/com.tencent.mm/MicroMsg/Download/%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90%E5%8A%9F%E8%83%BD%E6%B8%85%E5%8D%95.xlsx at index.html : 248

decodeURI:content://com.tencent.mm.external.fileprovider/external/Android/data/com.tencent.mm/MicroMsg/Download/数据分析功能清单.xlsx at index.html : 251
云象智能科技有限公司 发表于 2021-8-14 11:45
data:content://com.tencent.mm.external.fileprovider/external/Android/data/com.tencent.mm/MicroMsg ...

目前这个方法不支持 content路径,可以尝试将content://com.tencent.mm.external.fileprovider/external  替换成  /storage/emulated/0 试一下
Robot_Lee 发表于 2021-8-17 13:45
目前这个方法不支持 content路径,可以尝试将content://com.tencent.mm.external.fileprovider/external  ...

在其他手机上都没有问题的,只是在华为M40p 鸿蒙上中文不行,英文文件名也没问题。说明是支持 content路径的,只是在这个机型上有bug
380
帖子
4
勋章
6
Y币
我反馈给模块技术再看看
12下一页
您需要登录后才可以回帖 登录

本版积分规则