貌似这个问题有很多玩家遇到,微信官方说法是根据服务器响应的header中的Content-Type来决定下载到本地的文件的后缀的,
但是这个特性支持的特别不好,如果下载后,文件后缀名为.unknown就不好搞了。
怎么解决的呢?
思路:
利用wx.downloadFile下载文件,获取到tempFilePath临时文件。这个临时文件路径不要改动。
利用wx.getFileSystemManager获取到FileSystemManager对象,利用该对象的saveFile方法,把临时文件保存为本地文件,保存成功后,其success函数回调会返回savedFilePath本地路径。这个路径会把上面的临时文件移动到这个本地路径中,但是后缀名仍然为unknown。这一步的目的是把临时文件保存为本地文件。
本地文件已经有了,我们就可以对本地文件进行任意的操作。利用FileSystemManager对象的copyFile,把上面的后缀为unknown的本地文件,复制到另外的本地文件。这个时候你可以任意定义复制到的文件的后缀。
有一点坑的是:上面第一步、第二步中的文件的路径(tempFilePath、savedFilePath)我们都是知道的,但是第三部中的复制到的目标路径需要开发者自己定义路径。这个时候我们需要用到wx.env.USER_DATA_PATH常量。 这个常量是微信为每个小程序小游戏搞得目录地址,在这个路径下面你可以新建、删除等文件或者文件夹。有这个知识储备,你可以先调用FileSystemManager对象的mkdir方法,在wx.env.USER_DATA_PATH常量路径下新建一个文件夹,然后你再调用第三步的copyFile就可以了。
注:
第二步和第三步可以合并。
wx.downloadFile下载文件可以利用filePath指定下载的目标路径,这样可以省略上面的第二步操作,直接利用这个filePath进行第三部的复制操作,把后缀为unknown的filePath文件,复制到指定的文件后缀的目标文件中,然后就可以使用该文件了。
下面的代码是用TypeScript写的,但是逻辑思路是一样的。
(这是随便写的一个demo,代码有点乱堆,各位大佬轻喷~)
private beginLoad(): void { var that = this ; if (Laya.Browser.onWeiXin) {
fileMgr.access({ path: wx.env.USER_DATA_PATH + '/music/music.wav' , success: function (res) { console.log( 'access res:' , res); AudioMgr.playMusic(wx.env.USER_DATA_PATH + '/music/music.wav' );
fail: function (res) { console.log( 'access file fail.' , res); wx.downloadFile({ url: 'http://fjdx.sc.chinaz.com/Files/DownLoad/sound1/201808/10453.wav' , header: '' , filePath: '' , success: function (res) { console.log( 'down load file success.' , res); that.saveMusicFile(res.tempFilePath); }, fail: function (res) { console.log( 'down load file fail.' , res); }, }); } }); } }
//保存临时文件到本地路径 private saveMusicFile(tempPath): void {
fileMgr.getSavedFileList({ success: function (savedFiles) { console.log( 'saved files:' , savedFiles); var fileList = savedFiles.fileList as Array<any>; for ( var i=0; i<fileList.length; i++) { fileMgr.removeSavedFile({ filePath: fileList[i].filePath, success: function (r) { console.log( 'remove save file. success.' , r); }, fail: function (r) { console.log( 'remove save file.' , r); } }); } }, fail: function (savedFiles) { console.log( 'saved files fail.' , savedFiles); }
fileMgr.saveFile({ tempFilePath: tempPath, success: function (data) {
fileMgr.mkdir({ dirPath: wx.env.USER_DATA_PATH + 'music' , success: function (res) {
fileMgr.copyFile({ srcPath: data.savedFilePath, destPath: wx.env.USER_DATA_PATH + '/music/music.wav' , success: function (result) {
AudioMgr.playMusic(wx.env.USER_DATA_PATH + '/music/music.wav' ); }, fail: function (result) { console.log( 'copy file fail>' , result); } }); }, fail: function (res) { console.log( 'mkdir fail res:' , res); } }); }, fail: function (data) { console.log( 'save file fail:' , data); } }); } |
你好,我按照你的步骤,返回的都是成功
可是为什么在手机上找不到文件呢
你copy到哪个文件路径了?你copy的路径就是你的需要的文件路径
我想问一下,如果保存到手机的指定路径
access
中的path怎么写啊??我一直再报"access:fail no such file or directory"的错误
我回答里面说了。你看的不仔细。
wx.env.USER_DATA_PATH +
'/music/music.wav'
,
前面是微信定的常量,这个路径下你有权操作文件以及文件夹。
在这个文件夹下面,你可以利用mkdir接口新建文件夹。
我的例子中,我新建了一个music文件夹,这个文件夹下面我创建了music.wav文件。
文件夹新建使用mkdir,新建文件可以直接写文件,这个文件不存在的话,微信自动回新建这个文件然后写入。
了解啦!!~~谢谢你的解答!!~~