收藏
评论

下载文件后缀名为unknown的解决方法

貌似这个问题有很多玩家遇到,微信官方说法是根据服务器响应的header中的Content-Type来决定下载到本地的文件的后缀的,

但是这个特性支持的特别不好,如果下载后,文件后缀名为.unknown就不好搞了。


怎么解决的呢?

思路:

  1. 利用wx.downloadFile下载文件,获取到tempFilePath临时文件。这个临时文件路径不要改动。

  2. 利用wx.getFileSystemManager获取到FileSystemManager对象,利用该对象的saveFile方法,把临时文件保存为本地文件,保存成功后,其success函数回调会返回savedFilePath本地路径。这个路径会把上面的临时文件移动到这个本地路径中,但是后缀名仍然为unknown。这一步的目的是把临时文件保存为本地文件

  3. 本地文件已经有了,我们就可以对本地文件进行任意的操作。利用FileSystemManager对象的copyFile,把上面的后缀为unknown的本地文件,复制到另外的本地文件。这个时候你可以任意定义复制到的文件的后缀。

  4. 有一点坑的是:上面第一步、第二步中的文件的路径(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);
            }
        });
    }


收藏

2 个评论

  • 卞円朲
    卞円朲
    2018-10-11

    你好,我按照你的步骤,返回的都是成功


    可是为什么在手机上找不到文件呢

    2018-10-11
    赞同
    回复 1
    • 龙印
      龙印
      2018-10-12

      你copy到哪个文件路径了?你copy的路径就是你的需要的文件路径

      2018-10-12
      回复
  • 王小锤
    王小锤
    2018-08-15

    我想问一下,如果保存到手机的指定路径access中的path怎么写啊??

    我一直再报"access:fail no such file or directory"的错误

    2018-08-15
    赞同
    回复 2
    • 龙印
      龙印
      2018-08-15

      我回答里面说了。你看的不仔细。

      wx.env.USER_DATA_PATH + '/music/music.wav',

      前面是微信定的常量,这个路径下你有权操作文件以及文件夹。

      在这个文件夹下面,你可以利用mkdir接口新建文件夹。


      我的例子中,我新建了一个music文件夹,这个文件夹下面我创建了music.wav文件。

      文件夹新建使用mkdir,新建文件可以直接写文件,这个文件不存在的话,微信自动回新建这个文件然后写入。


      2018-08-15
      1
      回复
    • 王小锤
      王小锤
      2018-08-15

      了解啦!!~~谢谢你的解答!!~~


      2018-08-15
      回复
登录 后发表内容