Чтение двоичных данных в python, отправка их через restful api и сохранение файла в nodejs - PullRequest
0 голосов
/ 08 сентября 2018

У меня есть двоичные данные, которые выглядят так:

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

При открытом сырье.

Я читаю двоичный файл с использованием Python:

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

Когда я отправляю его на свой сервер node.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");

Я не знаю, что такое второй формат, но я уверен, что это интерпретация двоичного файла, которую мне нужно конвертировать, я просто не могу понять, что мне больше гуглить.

Ответы [ 2 ]

0 голосов
/ 08 сентября 2018

Хорошо, ребята, я наконец-то понял, что делать!

В 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 я использовал библиотеку «stream», встроенную в узел вместе с файловой системой.

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

0 голосов
/ 08 сентября 2018

Попробуйте использовать 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");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...