下载文件后缀名为unknown的解决方法
貌似这个问题有很多玩家遇到,微信官方说法是根据服务器响应的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) {[代码][代码] [代码][代码]var[代码] [代码]fileMgr: FileSystemManager = wx.getFileSystemManager();[代码] [代码] [代码] [代码] //利用access方法判断文件是否可用[代码] [代码] [代码][代码]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 {[代码][代码] [代码][代码]var[代码] [代码]fileMgr: FileSystemManager = wx.getFileSystemManager();[代码] [代码] //这一步是把保存的文件列表删除掉。本地文件最大50M。很容易超过限制[代码] [代码] [代码][代码]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) {[代码][代码] [代码][代码]console.log([代码][代码]'save file:'[代码][代码], data);[代码] [代码] [代码] [代码] //新建dir目录,把保存的本地文件,复制到指定的文件夹下[代码] [代码] [代码][代码]fileMgr.mkdir({[代码][代码] [代码][代码]dirPath: wx.env.USER_DATA_PATH + [代码][代码]'music'[代码][代码],[代码][代码] [代码][代码]success: [代码][代码]function[代码][代码](res) {[代码][代码] [代码][代码]console.log([代码][代码]'mkdir success:'[代码][代码], res);[代码] [代码] [代码] [代码] //复制文件到目标文件夹下指定的后缀的文件中[代码] [代码] [代码][代码]fileMgr.copyFile({[代码][代码] [代码][代码]srcPath: data.savedFilePath,[代码][代码] [代码][代码]destPath: wx.env.USER_DATA_PATH + [代码][代码]'/music/music.wav'[代码][代码],[代码][代码] [代码][代码]success: [代码][代码]function[代码][代码](result) {[代码][代码] [代码][代码]console.log([代码][代码]'copy file :'[代码][代码], 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);[代码][代码] [代码][代码]}[代码][代码] [代码][代码]});[代码][代码] [代码][代码]}[代码]