nodejs和jquery - 传递和保存二进制文件

时间:2016-09-15 01:17:35

标签: jquery ajax node.js fs

我想做的事

从浏览器上传二进制文件(本例中为.docx)并将其保存在服务器上。在服务器上使用NodeJs / ExpressJS。

问题

我可以成功地将文本文件(.json / .txt / .csv)从客户端传递到服务器并成功保存,但是我似乎无法为二进制文件执行此操作。我得到"没有从文本到二进制的转换"文件损坏但没有数据错误或内部错误。

客户端

输入上传后,我拨打

fRead.readAsArrayBuffer(fName);

$ .ajax电话是

$.ajax({
        url: url,
        type: 'POST',
        data: obj, //the obj is the e.target.result from FileReader
        contentType: 'application/octet-stream',
        dataType: 'binary',
        success: function (data) {
            cbFn(data.msg);
        },
        error: function (xhr, status, error) {
            alert("error " + status + " " + error);
        }
    });

服务器端

在服务器端

fs.writeFile(saveFile, req.body, 'binary', (err) => {
  if (err) throw err;
  console.log('file saved to ' + saveFile);
});

现在在服务器端,上面的代码抛出了#34;没有从文本到二进制的转换"错误虽然它保存文件(损坏,没有数据)。如果我将其更改为

fs.writeFile(saveFile, Buffer.from(req.body), 'binary', (err) => {
  if (err) throw err;
  console.log('file saved to ' + saveFile);
});

我刚收到内部错误。

此时我不知道我的错误在哪里 - 是不是我在$ .ajax调用中使用了错误的编码类型?或者我在fs.writeFile中的选项是错误的,或者我根本不应该使用fs.writeFile和其他东西?我觉得有这么多的排列,所以我可以使用一些帮助。

同样感到惊讶的是,很难找到一个很好的在线文章 - 我只是想上传一个二进制文件并保存它!

1 个答案:

答案 0 :(得分:-1)

不要使用FileReader将其作为arrayBuffer读取,只需按原样发送blob

var file = new Blob(["321"])
$.ajax({
    type: 'POST',
    url: '/upload.php',
    data: file,
    processData: false,
    contentType: false
})