【问题标题】:nodejs and jquery - passing and saving a binary filenodejs 和 jquery - 传递和保存二进制文件
【发布时间】:2016-09-17 17:45:32
【问题描述】:

我要做什么

从浏览器上传一个二进制文件(在本例中为 .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);
});

现在在服务器端,上面的代码虽然保存了文件(已损坏,没有数据),但会引发“没有从文本转换为二进制”错误。如果我把它改成

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

我只是收到一个内部错误。

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

同样令人惊讶的是,很难找到适合这种情况的在线文章 - 我只是想上传一个二进制文件并保存它!

【问题讨论】:

    标签: jquery ajax node.js fs


    【解决方案1】:

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

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

    【讨论】:

    • 我不确定您是如何创建文件的。一旦我有了 fileReader 对象,在发送到服务器之前我需要做什么来读取内容?我在上面尝试了您的方法,只需从 fileReader.onload = function(e) 以及 e.target 和 e.target.result 传递“e”。不工作。 nodejs 服务器显示它没有 req.body...
    • 搞定 FileReader... 我假设 fName 是 blob,所以只需将 fName 发送为 data
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-20
    • 1970-01-01
    • 2016-02-21
    • 1970-01-01
    • 2017-09-17
    相关资源
    最近更新 更多