我一笑而过
我一笑而过
  • 发布:2023-12-29 16:39
  • 更新:2024-11-14 17:42
  • 阅读:2004

App端,uni.saveFile()保存文件后,无法找到文件,这个是bug吗?

分类:uni-app

在App端,使用uni.downloadFile()下载文件后再调用uni.saveFile()保存文件,在手机的文件管理器中无法找到下载保存后的文件

uni.downloadFile({  
                url: 'https://vkceyugu.cdn.bspapp.com/VKCEYUGU-hello-uniapp/2cc220e0-c27a-11ea-9dfb-6da8e309e0d8.mp3',  
                success: (res) => {  
                    if (res.statusCode === 200) {  
                        console.log('下载成功: ', res.tempFilePath);  
                        // 保存音频到手机  
                        uni.saveFile({  
                            tempFilePath: res.tempFilePath,  
                            success: (res) => {  
                                console.log('文件的保存路径: ', res.savedFilePath);  
                                // 关闭音频下载提示  
                                uni.hideLoading()  
                                // 打开音频下载成功提示  
                                uni.showToast({  
                                    title: '保存成功',  
                                    icon: 'success',  
                                    duration: 2000  
                                })  
                            }  
                        })  
                    }  
                }  
            })

保存成功的打印的文件路径: _doc/uniapp_save/17038387375250.mp3

这个是bug还是正常的?如果我想直接打开文件管理器,就能在“最近”里找到这个文件,应该怎样实现呢?

2023-12-29 16:39 负责人:HRK_01 分享
已邀请:
我一笑而过

我一笑而过 (作者)

@DCloud_UNI_LXH @DCloud_UNI_GSQ @DCloud_Android_ST 大佬们,能帮忙看看吗?不是Bug吧?

  • 4***@qq.com

    大佬解决了吗

    2024-08-05 15:22

  • 3***@qq.com

    回复 4***@qq.com: var dtask = plus.downloader.createDownload(e.url, {

    filename: 'file://storage/emulated/0/GYYF/' //自定义文件位置

    }, function(d, status){

    if(status == 200){

    console.log('文件已保存到:' + d.filename)

    }

    });

    dtask.start();

    2024-11-13 11:03

套马杆的套子

套马杆的套子 - 没有解决不了的问题,只有解决不完的问题

在android-data-你的包名-apps-你的appid-doc

也可以转成base保存

let imageStr = 'data:image/png;base64,' + base64

            // 保存到本地  
            let bitmap = new plus.nativeObj.Bitmap("test");  
            bitmap.loadBase64Data(imageStr, function() {  
                console.log("加载Base64图片数据成功");  
                var filePath = new Date().getTime() + Math.floor(Math.random() * 100);  
                bitmap.save("_doc/" + filePath + ".png", {}, function(i) {  
                    console.log('保存图片成功:' + JSON.stringify(i));  

                    }).catch(error => {  
                        console.log('RefImage数据插入失败', error)  
                    })  

                    bitmap.clear();  
                }, function(e) {  
                    onsole.log('保存图片失败:' + JSON.stringify(e));  
                    bitmap.clear();  
                });  
            }, function() {  
                console.log('加载Base64图片数据失败:' + JSON.stringify(e));  
                bitmap.clear();  
            });
  • 我一笑而过 (作者)

    能找到保存后的文件,但目录挺深的,不太便捷,开发找着都困难,更别说用户了,要保存的是个音频文件,还有更好的办法吗?

    2023-12-29 17:41

HRK_01

HRK_01

android11已经强制采用了分区存储,可以通过5+api来下载文件放到指定目录。缺点:无法后台下载,且依然无法通过最近来找到文件

// 本地路径开头使用file://,跟上手机文件本地目录storage/emulated/0,  
                    // 这时用户文件管理器能看到的了,之后创建 连信 作为文件夹,  
                    // 后缀是用于文件命名和格式修改,大家可以使用变量。  
                    let url = 'https://vkceyugu.cdn.bspapp.com/VKCEYUGU-hello-uniapp/2cc220e0-c27a-11ea-9dfb-6da8e309e0d8.mp3';  
                    let dtask = plus.downloader.createDownload(url, {  
                        filename: "file://storage/emulated/0/测试/" + “自定义文件名.mp3” //利用保存路径,实现下载文件的重命名  
                    }, (d, status) => {  
                        //d为下载的文件对象  
                        if (status == 200) {  
                            uni.hideLoading();  
                            uni.showToast({  
                                icon: 'none',  
                                mask: true,  
                                title: '已保存到文件夹:/测试/' + res.tempFilePath, //保存路径  
                                duration: 3000,  
                            });  
                            //下载成功,d.filename是文件在保存在本地的相对路径,使用下面的API可转为平台绝对路径  
                            let fileSaveUrl = plus.io.convertLocalFileSystemURL(d.filename);  
                            setTimeout(() => {  
                                plus.runtime.openFile(d.filename); //选择软件打开文件  
                            }, 1500)  
                        } else {  
                            //下载失败  
                            uni.hideLoading();  
                            plus.downloader.clear(); //清除下载任务  
                            uni.showToast({  
                                icon: 'none',  
                                mask: true,  
                                title: '下载失败,请稍后重试',  
                            });  

                        }  
                    })  
                    dtask.start();
  • 我一笑而过 (作者)

    这个方法我试过了,

    通过5+API保存的路径:内部存储设备>Android>data>程序包名>apps>UNI>downloads/storage/emulated/0/测试/测试.mp3

    通过uni.saveFile保存的路径:内部存储设备>Android>data>程序包名>apps>UNI
    >doc>uniapp_save>具体的文件名


    5+的方法没有把文件保存在:内部存储设备>storage>emulated>0>测试,这个路径下

    测试环境 Android 8.0

    2023-12-30 09:51

  • HRK_01

    回复 我一笑而过: 可以降低sdk版本试试

    2024-01-04 19:30

我一笑而过

我一笑而过 (作者)

5 的这个方法网上也有分享的,基本都是一样的代码

// 下载成功,d.filename是文件在保存在本地的相对路径,使用下面的API可转为平台绝对路径    
let fileSaveUrl = plus.io.convertLocalFileSystemURL(d.filename);    
    setTimeout(() => {    
        plus.runtime.openFile(d.filename); // 选择软件打开文件    
}, 1500)

这个选择软件打开文件也没有实际效果,uni.openDocument()方法倒是能拉起软件弹窗,选择打开,但是不支持音频格式的文件,代码中定义的变量 fileSaveUrl 也没真正使用

8***@qq.com

8***@qq.com - 欢迎观看最近更新的《uni-app 踩坑实录》,涉及一些在文档上不容易看到的疑难杂症的解决方案。https://www.bilibili.com/cheese/play/ss60198

也困扰我好久。 你试试在renderjs中通过创建a标签下载文件,不知道可不可以。(renderjs是为了兼容app)

要回复问题请先登录注册