在python中读取二进制数据,通过restful api发送它并将文件保存在nodejs中



我有如下所示的二进制数据:

MZ����K=�@���K=�ޡ���g������a;�������������¡�����ء�����������{�����<��������o�������������쁡�����������k�������������Rich����

生打开时。

我正在使用 Python 读取二进制文件:

data = open(path_to_watch+filename,  "rb").read()

当我将其发送到我的节点.js服务器时,它看起来像这样:

MZ90%00%03%00%00%00%04%00%00%00%FF%FF%00%00%B8%00%00%00%00%00%00%00%40%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%008%01%00%00%0E%1F%BA%0E%00%B4%09%CD%21%B8%01L%CD%21This+program+cannot+be+run+in+DOS+mode.%0D%0D%0A%24%00%00%00%00%00%00%00%BB%C0%92%BE%FF%A1%FC%ED%FF%A1%FC%ED%FF%A1%FC%EDK%3d

我正在尝试保存它,但对于我的一生,我无法让它与原始文件、文件大小匹配或在运行时工作:

data = req.body["file"];
data = data.replace("%", " ");
var buff = new Buffer(data.length);
for (x=0; x<data.length;x++){
buff[x] = data[x];
}
fs.writeFile("test.exe", data,"binary");

我不知道第二种格式是什么,但我确信这是我需要转换的二进制解释,我只是一辈子都不知道要谷歌什么了。

好吧,伙计们,我终于想出了 wtf 该做什么!

在 Python 中,我使用请求库作为"PUT"将数据作为八位字节流发送。

我通过像这样读取二进制来做到这一点:

data = open(path_to_watch+filename,  "rb").read()

然后使用请求库发送数据,如下所示:

response= requests.request("PUT", URL, data=data,  headers={'Content-Type': 'application/octet-stream'})

目前为止,一切都好?

在 Node JS 端,我使用了 node 中内置的"流"库以及文件系统。

var fs = require('fs');
var stream = require('stream');

app.put("/", function (req, res) {
var wstream = fs.createWriteStream("output.bin");
req.on('data', function(data){
wstream.write(data);
})
req.on('end', () =>{
wstream.end();
})

res.status(200).send({ message: 'File recieved' });
};

希望其他人不必像我一样花费 7 个小时进行调试:P

尝试使用decodeURIComponent()

data = decodeURIComponent(req.body["file"]);
var buff = new Buffer(data.length);
for (x=0; x<data.length;x++){
buff[x] = data[x];
}
fs.writeFile("test.exe", data,"binary");

最新更新