Multipart довольно сложен, если вы хотите, чтобы клиент выглядел так, как клиент обычно обрабатывает «multipart / form-data», вам нужно сделать несколько вещей.Сначала вы должны выбрать граничный ключ, обычно это случайная строка, чтобы отметить начало и конец частей (в этом случае это будет только одна часть, так как вы хотите отправить один файл).Каждая часть (или одна часть) будет нуждаться в заголовке (инициализированном граничным ключом), задающем тип содержимого, имя поля формы и кодировку передачи.После того, как части завершены, вам нужно пометить конец каждой части граничным ключом.
Я никогда не работал с multipart, но я думаю, что это то, как это можно сделать.Кто-то, пожалуйста, поправьте меня, если я ошибаюсь:
var boundaryKey = Math.random().toString(16); // random string
request.setHeader('Content-Type', 'multipart/form-data; boundary="'+boundaryKey+'"');
// the header for the one and only part (need to use CRLF here)
request.write(
'--' + boundaryKey + '\r\n'
// use your file's mime type here, if known
+ 'Content-Type: application/octet-stream\r\n'
// "name" is the name of the form field
// "filename" is the name of the original file
+ 'Content-Disposition: form-data; name="my_file"; filename="my_file.bin"\r\n'
+ 'Content-Transfer-Encoding: binary\r\n\r\n'
);
fs.createReadStream('./my_file.bin', { bufferSize: 4 * 1024 })
// set "end" to false in the options so .end() isnt called on the request
.pipe(request, { end: false }) // maybe write directly to the socket here?
.on('end', function() {
// mark the end of the one and only part
request.end('--' + boundaryKey + '--');
});
Опять же, я никогда не делал этого раньше, но я думаю , как это можно сделать.Может быть, кто-то более знающий мог бы дать более глубокое понимание.
Если вы хотите отправить его в формате base64 или в кодировке, отличной от необработанного двоичного файла, вы должны будете выполнить все операции конвейера самостоятельно.В конечном итоге все будет сложнее, потому что вам придется приостановить поток чтения и ждать событий утечки по запросу, чтобы убедиться, что вы не используете всю свою память (если это не большой файл, вы обычноне стоит беспокоиться об этом, хотя). EDIT: На самом деле, не важно, что вы могли бы просто установить кодировку в параметрах потока чтения.
Я буду удивлен, если нет модуля Node, который уже делает это.Может быть, кто-то более осведомленный по этому вопросу может помочь с деталями низкого уровня, но я думаю, что где-то должен быть модуль, который делает это.