1

Busboy で奇妙な問題が発生しています。Invoke-RestMethod を使用して PowerShell から Node.js で記述されたリモート サーバーにファイルをアップロードしています。ストリーム関数を使用すると、コードは問題なく動作します。バイナリ データを受け入れ、問題なくファイルをローカル ドライブに書き込みます。ただし、Busboy を使用すると、「境界エラーが見つかりません」と表示されます。この問題を解決するために、境界を Invoke-RestMethod に渡します。これで境界エラーは解消されますが、Busboy はファイル イベントをまったく起動しません。私は頭をかいて、すでに2日間理解しようとしてきましたが、解決策は私にはわからないようです. 数週間前はまったく同じコードが問題なく動作していましたが、もう動作しません。作業環境に変更が加えられたかどうかはわかりませんが、非常に奇妙です。

ストリーム コード: これは問題なく動作します

サーバーコード

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);
}

パワーシェル

$upload= Invoke-RestMethod -Uri "http://localhost:8088/file" -Method Post -InFile $imagePath -ContentType 'multipart/form-data'

Busboy コード: これにより Missing Boundary エラーがスローされます

サーバーコード

fs = require('fs');
server = restify.createServer();
server.post('/file',restify.queryParser(),uploadFile);    
function uploadFile(req, res, next) {   
    var fileStream = new BusBoy({ headers: req.headers });  
}

パワーシェル

$upload= Invoke-RestMethod -Uri "http://localhost:8088/file" -Method Post -InFile $imagePath -ContentType 'multipart/form-data'

境界が設定され、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();      
    });
}

これの原因は何ですか?すべてのご意見に感謝します。

4

1 に答える 1

1

イベントがない理由fileは、要求データが正しくフォーマットされていないためmultipart/form-dataです (少なくとも、各部分の適切なヘッダーが欠落しています)。

于 2015-07-14T05:39:46.307 に答える