2***@qq.com
2***@qq.com
  • 发布:2020-03-16 18:18
  • 更新:2023-06-13 09:46
  • 阅读:31112

文件下载保存, 遇到uni.downloadFile的坑

分类:uni-app
 uni.downloadFile({  
            //https://dss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo_top-e3b63a0b1b.png  
             url: 'http://music.163.com/song/media/outer/url?id=65538.mp3',   
             success: (res) => {  
                     if (res.statusCode === 200) {  
                         console.log('下载成功');  
                     }  
                  console.log(res.tempFilePath);  
                  uni.saveFile({  
                       tempFilePath: res.tempFilePath,  
                       complete(res) {  
                         console.log(res)  
                       }  
                     });  
             }  
         });

按官网api通过uni.downloadFile,获得tempFilePath 临时文件路径,再调用uni.saveFiled保存文件。测试发现几个问题:

  1. 下载图片(小文件),下载成功后调saveFiled 是可以保存成功的。但是换成MP3文件(大文件),下载成功后,保存报错提示文件不存在;

    。这个问题不知是BUG,还是说这种方式就不支持大文件。

  2. uni.downloadFile 不支持后台下载,手机黑屏就暂停下载了。

现在解决方案 改用H5+api
不多BB直接看代码:
//查看已下载的文件

         function checkDownload(){  
            plus.io.requestFileSystem( plus.io.PUBLIC_DOWNLOADS, function(fs){  
                    var directoryReader = fs.root.createReader();  
                    directoryReader.readEntries( function( entries ){  
                        var i;  
                        for( i=0; i < entries.length; i++ ) {  
                                    console.log( entries[i].name );  
                                    entries[i].name = i  
                        }   
                    }, function ( e ) {  
                        console.log( "Read entries failed: " + e.message );  
                    });  
                });  
         }    

         // 创建下载任务  
         function createDownload() {  
            var dtask = plus.downloader.createDownload("https://dss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo_top-e3b63a0b1b.png", {}, function(d, status){  
                // 下载完成 下载的文件会保存在 PUBLIC_DOWNLOADS 目录下,只要不主动删除都会存在  
                if(status == 200){   
                    console.log("Download success: ");  
                    console.log(d);  
                    checkDownload()  
                } else {  
                     console.log("Download failed: " + status);   
                }    
            });  
            ;  
            dtask.start();   
         }  
         createDownload()   


解决了问题1, 下载文件, 查看已下载的文件。
这个方式依然不能后台下载。
还有不知怎么修改下载的文件名

0 关注 分享

要回复文章请先登录注册

4***@qq.com

4***@qq.com

回复 1***@qq.com :
我也是这种情况QAQ,请问最后怎么解决的呀
2023-06-13 09:46
8***@qq.com

8***@qq.com

h5端可以使用这个下载功能吗?
2023-04-18 21:41
4***@qq.com

4***@qq.com

在手机上运行是可以吗?
2021-12-22 10:56
1***@qq.com

1***@qq.com

回复 1***@qq.com :
后端接口提供的是直接返回图片
2021-10-20 16:14
1***@qq.com

1***@qq.com

我下载的图片文件,但是成功返回的是json,很奇葩,如何破
2021-10-20 16:13
天生DR

天生DR

你这个是哪个平台会不成功? iOS 还是 Android 还是小程序?
2021-05-28 14:32
勇敢的心_

勇敢的心_

回复 白春光 :
好像就是找不到
2021-05-27 19:14
zopen

zopen

```javascript
plus.io.resolveLocalFileSystemURL(tempFilePath,(srcEntry)=>{
plus.io.resolveLocalFileSystemURL("_doc",(dstEntry)=>{
dstEntry.getDirectory("uniapp_save",{create:true,exclusive:false},(saveEntry)=>{
//console.log("srcEntry.toURL",srcEntry.toURL())
//console.log("dstEntry.toURL",dstEntry.toURL())
//console.log("saveEntry.toURL",saveEntry.toURL())
let fnames = srcEntry.name.split(".");
let fileName = Buffer.from(fnames[0]).toString('hex')+(fnames[1]?('.'+fnames[1]):'');
//console.log("fileName",fileName)
srcEntry.moveTo(saveEntry,fileName,(res)=>{
const savedFilePath = res.toURL()
console.log("savedFilePath",savedFilePath)
uni.setStorage({
key: key,
data: savedFilePath
})
complete && complete(savedFilePath)
});
})
},(err)=>{
console.error(err);
})
});

```
2021-04-29 12:35
zopen

zopen

改文件名,我这么解决的plus.io.resolveLocalFileSystemURL(tempFilePath,(srcEntry)=>{
plus.io.resolveLocalFileSystemURL("_doc",(dstEntry)=>{
dstEntry.getDirectory("uniapp_save",{create:true,exclusive:false},(saveEntry)=>{
//console.log("srcEntry.toURL",srcEntry.toURL())
//console.log("dstEntry.toURL",dstEntry.toURL())
//console.log("saveEntry.toURL",saveEntry.toURL())
let fnames = srcEntry.name.split(".");
let fileName = Buffer.from(fnames[0]).toString('hex')+(fnames[1]?('.'+fnames[1]):'');
//console.log("fileName",fileName)
srcEntry.moveTo(saveEntry,fileName,(res)=>{
const savedFilePath = res.toURL()
console.log("savedFilePath",savedFilePath)
uni.setStorage({
key: key,
data: savedFilePath
})
complete && complete(savedFilePath)
});
})
},(err)=>{
console.error(err);
})
});
2021-04-29 12:34
白春光

白春光

回复 勇敢的心_ :
找到问题了吗 ?我也遇到了
2021-04-26 18:41