Странное поведение от Busboy
У меня странная проблема с Басбоем. Я загружаю файл из powershell с помощью Invoke-RestMethod на удаленный сервер, написанный на Node.js. Код работает без проблем, если я использую функцию потока. Он принимает двоичные данные и записывает файл на локальный диск без перебоев. Тем не менее, это дает мне "Отсутствует ошибка границы", когда я использую Busboy. Чтобы решить эту проблему, я передаю границу Invoke-RestMethod. Это избавляет от ошибки границы, но Busboy вообще не запускает файловое событие. Я чесал голову и пытался выяснить уже два дня, и решение, кажется, ускользает от меня. Тот же самый код работал просто отлично пару недель назад, но он больше не работает. Я не уверен, были ли внесены какие-либо изменения в рабочую среду, но очень странно.
Код потока: это работает просто отлично
Код сервера
fs = require('fs');
server = restify.createServer();
server.post('/file',restify.queryParser(),uploadFile);
function uploadFile(req, res, next) {
var wstream = fs.createWriteStream("x.jpg");
req.pipe(wstream);
}
Powershell
$upload= Invoke-RestMethod -Uri "http://localhost:8088/file" -Method Post -InFile $imagePath -ContentType 'multipart/form-data'
Код Busboy: Это выдает ошибку отсутствия границы
Код сервера
fs = require('fs');
server = restify.createServer();
server.post('/file',restify.queryParser(),uploadFile);
function uploadFile(req, res, next) {
var fileStream = new BusBoy({ headers: req.headers });
}
Powershell
$upload= Invoke-RestMethod -Uri "http://localhost:8088/file" -Method Post -InFile $imagePath -ContentType 'multipart/form-data'
Код Powershell с набором границ и измененным кодом Node.js. "На файл" не вызывается.
Powershell
$begin = @"
---BlockBoundary---
"@
$end = @"
---BlockBoundary---
"@
Add-Content 'RequestBodySavedToFile' $begin
$imageData = Get-Content $imagePath -Raw -Encoding Byte
Add-Content 'RequestBodySavedToFile' $imageData -Encoding Byte
Add-Content 'RequestBodySavedToFile' $end
$url = "http://localhost:8088/file"
$contentType = "multipart/form-data; boundary=$begin"
$upload= Invoke-RestMethod -Uri $url1 -Method Post -InFile "RequestBodySavedToFile" -ContentType $contentType
Код сервера
fs = require('fs');
server = restify.createServer();
server.post('/file',restify.queryParser(),uploadFile);
function uploadFile(req, res, next) {
var fileStream = new BusBoy({ headers: req.headers });
req.pipe(fileStream);
fileStream.on('file', function(fieldname, file, filename, encoding, mimetype) {
console.log('File [' + fieldname + ']: filename: ' + filename + ', encoding: ' + encoding + ', mimetype: ' + mimetype);
res.end();
});
}
Есть идеи, что вызвало это? Я очень ценю за любой вклад.
1 ответ
Причины нет file
события, потому что данные запроса не правильно отформатированы в соответствии с multipart/form-data
(по крайней мере, вам не хватает соответствующих заголовков для каждой части).