来自 Busboy 的奇怪行为
Strange behavior from Busboy
我在使用 Busboy 时遇到了一个奇怪的问题。我正在使用 Invoke-RestMethod 从 powershell 上传文件到用 Node.js 编写的远程服务器。如果我使用流函数,代码可以正常工作。它接受二进制数据并将文件写入本地驱动器而不会打嗝。但是,当我使用 Busboy 时,它会给我 "Missing boundary error"。为解决该问题,我将边界传递给 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 代码。 "On file" 没有被调用。
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();
});
}
知道是什么原因造成的吗?我非常感谢所有的输入。
没有 file
事件的原因是请求数据未根据 multipart/form-data
正确格式化(您至少缺少每个部分的适当 headers) .
我在使用 Busboy 时遇到了一个奇怪的问题。我正在使用 Invoke-RestMethod 从 powershell 上传文件到用 Node.js 编写的远程服务器。如果我使用流函数,代码可以正常工作。它接受二进制数据并将文件写入本地驱动器而不会打嗝。但是,当我使用 Busboy 时,它会给我 "Missing boundary error"。为解决该问题,我将边界传递给 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 代码。 "On file" 没有被调用。
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();
});
}
知道是什么原因造成的吗?我非常感谢所有的输入。
没有 file
事件的原因是请求数据未根据 multipart/form-data
正确格式化(您至少缺少每个部分的适当 headers) .