我想做的事
从浏览器上传二进制文件(本例中为.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和其他东西?我觉得有这么多的排列,所以我可以使用一些帮助。
同样感到惊讶的是,很难找到一个很好的在线文章 - 我只是想上传一个二进制文件并保存它!
答案 0 :(得分:-1)
不要使用FileReader将其作为arrayBuffer读取,只需按原样发送blob
var file = new Blob(["321"])
$.ajax({
type: 'POST',
url: '/upload.php',
data: file,
processData: false,
contentType: false
})