【发布时间】:2015-02-27 03:01:54
【问题描述】:
我正在使用 jQuery ajax 获取请求读取二进制文件文件,我在其中接收文件(在我的情况下为 zip 文件)作为字符串返回。一旦我在浏览器中对文件执行了一些操作(而不是修改文件),我需要通过 ajax 将其传输回服务器端点(在这种情况下,使用 express 3 的 nodejs)。我正在尝试通过以下 POST 请求执行此操作,由于需要使用 encodeURIComponent 对我的字符串进行编码,因此我认为我遇到了问题:
var fd = new FormData();
fd.append("filedata", encodeURIComponent(data), "filedata"); // data is my binary string
fd.append("filename", $('#url-input').val().split('/').slice(-1)[0]);
$.ajax({
type: "POST",
url: 'endpoint',
data: fd,
processData: false,
contentType: false,
success: function() {
alert('save successful');
}
});
端点包含此代码,它将数据作为缓冲区存储在 mongodb 中:
app.post('/endpoint', function(req, res) {
var newData = {};
newData.file = new Mongo.Binary(new Buffer(decodeURIComponent(req.body.filedata), "binary"));
newData.name = req.body.filename;
newData.date = moment().format('MMMM Do YYYY, h:mm:ss a');
database.insert(newData, {safe: true}, function() { console.log('inserted new data'); });
});
这似乎按计划进行,但是,当我稍后检索文件时,它有点损坏。当我将其与十六进制编辑器中的原始值进行比较时,该值接近但不准确,这是两个文件部分的示例:
原始文件:
01 02 54 03 08 5D 08 5D 66 18 61 66 19 1B 67 1C 03 66 01 02 7A 85 14 80 7E 7F 81 82 85 85 80 80 85 5D 80 5D 14 80 14 80 89 8A 81 82 80 80 80 80 80 5D 80 5D 67 66 03 03 6D 6C 11 64 01 02 2E 37 57 85 57 80 85 57 80 57 57 8C 54 85 8C 8C 85 85 80 57 80 57 7A 80 14 80 8C 57 85 57 1A 8C 57 85 57 8C 57 85 18 1B 6D 1C 3E 30 15 57 37 37 6C 66 54 24 57 34 15 57 15 2E 01 2E 02 57 37 54 2C 2D 76 2E 74 77 68 6B 68 68 71 71 74 74 A7 A7 A7 A7 19 19 66 71 19 1A 08 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 DD DE 10 EE 6D 8B 7C 01 69 6A 6A 5C 10 21 7C 60 56 CC EE 02 1C 01 BE 8C 8D 8D 8D 44 AC AE 01
来自已发布文件的对应字符串,请注意它仅略有不同:
01 02 54 03 08 5D 08 5D 66 18 61 66 19 1B 67 1C 03 66 01 02 7A FD 14 FD 7E 7F FD FD FD FD FD FD FD 5D FD 5D 14 FD 14 FD FD FD FD FD FD FD FD FD FD 5D FD 5D 67 66 03 03 6D 6C 11 64 01 02 2E 37 57 FD 57 FD FD 57 FD 57 57 FD 54 FD FD FD FD FD FD 57 FD 57 7A FD 14 FD FD 57 FD 57 1A FD 57 FD 57 FD 57 FD 18 1B 6D 1C 3E 30 15 57 37 37 6C 66 54 24 57 34 15 57 15 2E 01 2E 02 57 37 54 2C 2D 76 2E 74 77 68 6B 68 68 71 71 74 74 FD FD FD FD 19 19 66 71 19 1A 08 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
我应该注意我已经尝试在我的代码中使用其他功能,例如客户端上的 btoa 和服务器上的 atob(带有模块),但所有这些都需要使用 encodeURIComponent,我相信这是破坏数据。我还可以通过稍微不同的路线和传统形式的帖子将二进制数据存储在我的 mongodb 中。
有其他人遇到过这个问题吗?
【问题讨论】:
-
如果不修改文件,为什么不能正常使用FormData上传文件?
-
因为一旦这样做,在某些情况下文件会被修改,我只是注意到在这种情况下我没有修改文件,所以它应该与我比较的原始文件相同反对。
-
JavaScript 字符串不包含二进制数据,它们包含 utf-16 代码点或 ucs-2? idk 但不是二进制。尝试使用类型化数组或 blob 来隐藏数据。
-
你能试着在没有其他东西的情况下重现这个吗?如果
encodeURIComponent有问题,您可以直接通过调用对某个字符串进行编码和解码来重现它。事实上,我不觉得我们有一个可重复的案例,有人可以在没有猜测的情况下实际回答。 -
抱歉,我觉得我已经尽可能地精简了它,同时仍在解释正在发生的一切。我会用它做更多的工作,看看我是否能想出更多的验证它是 encodeURIComponent。而data根据typeof函数肯定是字符串
标签: javascript jquery ajax html node.js