fileReader:readAsArrayBuffer()vs readAsBinaryString()

kev*_*ius 9 filereader node.js meteor

我正在使用reader.readAsArrayBuffer()将文件发送到node.js,以便我可以将其保存在/ public文件夹中.

reader.readAsArrayBuffer(event.currentTarget.files[0])
Run Code Online (Sandbox Code Playgroud)

读取完成后,调用Meteor.method()

            reader.addEventListener("loadend", function(evt){

                Meteor.call("saveFile", reader.result)

            })
Run Code Online (Sandbox Code Playgroud)

meteor方法接收文件并将其保存到我的公共/文件夹.

      saveFile:function(file){

            var fs = Npm.require("fs")

            fs.writeFile('../../../../../public/logo/jow.png', file, {encoding:"binary"}, function (err) {

                console.log(err)
                console.log("file saved")

            });

        }
Run Code Online (Sandbox Code Playgroud)

但问题是我从来没有得到正确的编码,当在/public/logo/jow.png中打开文件时,我得到以下消息:

jow.png can not be read, it may be damaged.
Run Code Online (Sandbox Code Playgroud)

但是当我将readAsArrayBuffer()更改为readAsBinaryString()时,它按预期工作,我可以打开图像.

有任何想法吗?

jtw*_*ers 1

是因为readAsArrayBuffer以二进制数据(blob)发送信息。

如果您查看nodejs缓冲区和字符编码中的文档,则binary编码是编码的别名latin1

我不知道流星,但如果是,fileBuffer可以按原样发送。

例子:

<body>
    <input type="file" />
    <button onclick="sendFile();">sendFile</button>
    <script>
        const sendFile = async () => {
            const reader = new FileReader();
            const file = document.querySelector('input[type=file]').files[0];

            reader.onloadend = function () {
                var xmlHttpRequest = new XMLHttpRequest();
                xmlHttpRequest.open("POST", 'http:/localhost:1234/', true);
                xmlHttpRequest.setRequestHeader("Content-Type", file.type);
                xmlHttpRequest.send(reader.result);
            }

            reader.readAsArrayBuffer(file);
        };
    </script>
</body>
Run Code Online (Sandbox Code Playgroud)
const http = require("http");
const fs = require("fs");

http.createServer((req, res) => {
    if (req.method === "OPTIONS") {
        res.setHeader('Access-Control-Allow-Origin', '*');
        res.setHeader('Access-Control-Allow-Methods', 'POST, GET, PUT, DELETE, OPTIONS');
        res.setHeader('Access-Control-Allow-Headers', '*');
        res.writeHead(200, { });
        res.end();
        return;
    }

    if (req.method === "POST") {
        const data = [];
        req.on('data', chunk => {
            data.push(chunk);
        });
        req.on('end', () => {
            fs.writeFileSync(__dirname + "/file.png", Buffer.concat(data));
            res.writeHead(200, { });
            res.end();
        });
        return;
    }
}).listen(1234);
Run Code Online (Sandbox Code Playgroud)

我发送一个 PNG 文件并打开它,遇到任何问题。