代码之家  ›  专栏  ›  技术社区  ›  Kevin Müller

使用javascript更改字节保存二进制数据

  •  0
  • Kevin Müller  · 技术社区  · 2 年前

    我有一些二进制数据,我想用javascript保存到一个文件中。发送数据的后端是用python编写的。

    以下是使用flasks send_文件发送二进制数据的后端代码:

    def exportSavedata(characterId):
        character = Characters.query.filter_by(id=characterId, user_id=current_user.id).first()
        savedata = character.savedata
        
        exportFolder = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'exportSavedata')
        if not os.path.isdir(exportFolder):
            os.mkdir(exportFolder)
        filename = f"{character.name}_{datetime.datetime.now().strftime('%Y%m%d%H%M%S')}.bin"
        filepath = os.path.join(exportFolder, filename)
        with open(filepath, 'wb') as f:
            f.write(savedata)
        return send_file(filepath)
    

    63 6D 70 20 32 30 31 31 30 31 31 33 20 20 20 00    cmp.20110113....
    00000010: 00 50 01 00 01 01 07 67 9A E4 FF 4B 65 79 72 6F    .P.....g.d.Keyro
    00000020: 69 69 00 4D BE 32 23 00 01 7D EF 35 00 01 C1 FF    ii.M>2#..}o5..A.
    00000030: 40 01 00 01 80 80 00 02 08 00 01 08 00 0A 58 70    @.............Xp
    00000040: 01 00 0E 18 24 20 00 04 1C 00 0B 04 00 01 01 01    ....$...........
    00000050: 80 00 03 80 03 00 02 30 08 00 13 AD C7 C0 13 00    .......0...-G@..
    00000060: 02 40 00 01 30 33 08 A0 03 01 1E 08 01 00 01 01    .@..03..........
    00000070: 00 01 04 01 06 9C 00 0D 01 06 F6 00 0D 01 06 1C    ..........v.....
    00000080: 00 0D 01 06 88 02 00 0C 01 06 63 00 0D 01 06 1E    ..........c.....
    00000090: 02 00 0C 01 06 7F 00 0D 01 06 0C 02 00 0C 01 07    ................
    000000a0: 01 00 0D 01 07 0D 00 0D 01 07 6C 00 0D 01 02 C4    ..........l....D
    000000b0: 0E 01 00 0B 01 03 A5 0C 00 0C 01 04 A0 0C 00 0C    ......%.........
    000000c0: 01 05 3A 0D 00 0C 01 00 01 A0 0C 00 0C 01 02 F3    ..:............s
    [...]
    

    downloadSavefile(){
                axios.get("http://127.0.0.1:5000/export/" + this.characterData.id)
                    .then(response => {
                        const a = document.createElement("a");
                        const blob = new Blob([response.data], { type: "octet/stream" });
                        const url = window.URL.createObjectURL(blob);
                        a.href = url;
                        a.download = this.characterData.name + ".bin";
                        a.click();
                        window.URL.revokeObjectURL(url);
                    })
            },
    

    javascript创建的文件:

    63 6D 70 20 32 30 31 31 30 31 31 33 20 20 20 00    cmp.20110113....
    00000010: 00 50 01 00 01 01 07 67 EF BF BD EF BF BD EF BF    .P.....go?=o?=o?
    00000020: BD 4B 65 79 72 6F 69 69 00 4D EF BF BD 32 23 00    =Keyroii.Mo?=2#.
    00000030: 01 7D EF BF BD 35 00 01 EF BF BD EF BF BD 40 01    .}o?=5..o?=o?=@.
    00000040: 00 01 EF BF BD EF BF BD 00 02 08 00 01 08 00 0A    ..o?=o?=........
    00000050: 58 70 01 00 0E 18 24 20 00 04 1C 00 0B 04 00 01    Xp....$.........
    00000060: 01 01 EF BF BD 00 03 EF BF BD 03 00 02 30 08 00    ..o?=..o?=...0..
    00000070: 13 EF BF BD EF BF BD EF BF BD 13 00 02 40 00 01    .o?=o?=o?=...@..
    00000080: 30 33 08 EF BF BD 03 01 1E 08 01 00 01 01 00 01    03.o?=..........
    00000090: 04 01 06 EF BF BD 00 0D 01 06 EF BF BD 00 0D 01    ...o?=....o?=...
    000000a0: 06 1C 00 0D 01 06 EF BF BD 02 00 0C 01 06 63 00    ......o?=.....c.
    000000b0: 0D 01 06 1E 02 00 0C 01 06 7F 00 0D 01 06 0C 02    ................
    000000c0: 00 0C 01 07 01 00 0D 01 07 0D 00 0D 01 07 6C 00    ..............l.
    [...]
    

    正如你所见,在从后端发送文件和将文件保存到前端之间,一些字节会发生变化。 我最初使用文件保护程序npm包保存文件,但为了找出根本原因,我转而使用普通javascript解决方案,遗憾的是,该解决方案没有解决问题。

    1 回复  |  直到 2 年前
        1
  •  1
  •   davecardwell    2 年前

    { responseType: 'blob' } 作为你的第二个论点 .get()

    然后尝试设置 const url = window.URL.createObjectURL(response.data); 相反