Как отправить буфер в HTTP-запросе?

У меня есть файл в памяти (буфер) - в файловой системе нет файла. Я хочу отправить этот буфер на другой сервер, который говорит HTTP.

Например, некоторый API A создает файл в памяти, SignServer манипулирует такими файлами и отвечает новым буфером. Мой API берет файл из A и передает его в SignServer.

Я попытался отправить файл в SignServer несколькими способами, но он продолжает отвечать со статусом 400 (в запросе отсутствует поле "данные").


Что я пробовал:

var http = require('http');
var querystring = require('querystring');

var data = querystring.stringify({
    workerName: 'PDFSigner',
    data: file_buffer
});

var request = new http.ClientRequest({
    hostname: 'localhost',
    port: 8080,
    path: '/signserver/process',
    method: 'GET',
    headers: {
        'Content-Type': 'application/x-www-form-urlencoded',
        // I also tried 'multipart/form-data'
        'Content-Length': Buffer.byteLength(data)
    }
});

request.end(data);

Я пробовал печатать dataи это показало:

workerName = PDFSigner & данные =

Что плохо, потому что data не был установлен в file_buffer, Я пробовал печатать file_bufferи у него есть содержимое (не нулевое, не неопределенное, внутри фактически есть байты). Так что строковое расположение буфера дало пустую строку.

Я пытался сделать то же самое с модулем запроса, и он тоже не работал.

Обратите внимание, что SignServer не написан ни в Node, ни в JavaScript. Это Java-приложение, поэтому оно, вероятно, не работает с json (вот почему я пытаюсь сделать это с querystring). Да, я пытался отправить JSON.

1 ответ

Решение

Причина по которой data устанавливается в пустую строку, описанную в этой проблеме, и решение дано в этой проблеме.

экранируйте и зашифруйте буфер следующим образом:

var data = querystring.stringify({
    workerName: 'PDFSigner',
    data: escape(file_buffer).toString('binary')
});

Как уже упоминалось @robertklep, ваша другая проблема в том, что вы не можете отправить большой файл, используя application/x-www-form-urlencoded, Вам нужно сделать это с multipart/form-data,

Другие вопросы по тегам