Странное поведение от 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 (по крайней мере, вам не хватает соответствующих заголовков для каждой части).

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