我有一个用Node.js编写的服务器端脚本和用C#编写的客户端脚本。我正在尝试使用管道方法从C#脚本保存文件上载。但是,我得到零字节文件。这就是我所做的 -
restify = require('restify'),
session = require('restify-session')({
debug : false,
ttl : 1200 // Time to live in seconds
});
request = require('request');
fs = require('fs');
server = restify.createServer();
server.use(restify.queryParser());
server.use(restify.bodyParser());
server.post('/upload', uploadFile);
function uploadFile(req, res, next) {
var x = fs.createWriteStream('file.jpg');
req.pipe(x);
}
我检查了req.body,似乎它包含C#脚本试图上传的文件的内容。所以我认为C#脚本没有问题。它之前是查询字符串。
由于
更新
我删除了身体解析器,现在管道正在工作。但是,它还会编写一些标题信息,例如Content-Disposition,Content-Type以及文件内容。我是否需要使用特定的解析器?
restify = require('restify'),
session = require('restify-session')({
debug : false,
ttl : 1200 // Time to live in seconds
});
request = require('request');
fs = require('fs');
server = restify.createServer();
server.post('/upload', restify.queryParser(), uploadFile);
function uploadFile(req, res, next) {
var x = fs.createWriteStream('file.jpg');
req.pipe(x);
}
答案 0 :(得分:2)
如果您看到req.body
设置为某个内容,则意味着该请求已被处理,因此没有任何内容可以传输到您的文件WriteStream。
所以你需要移动你的身体解析中间件,以便它们只针对需要它们的路由执行,或者(作为更多的黑客攻击)你可以编写一个自定义中间件,只有动态调用正文解析中间件,如果它没有不符合您要上传文件的路线标准。
答案 1 :(得分:0)
试试这个:
var fs = require('fs');
var url = require('url');
var http = require('http');
var exec = require('child_process').exec;
var spawn = require('child_process').spawn;
var file_url = <download url>;
var DOWNLOAD_DIR = './downloads/';
var mkdir = 'mkdir -p ' + DOWNLOAD_DIR;
var child = exec(mkdir, function(err, stdout, stderr) {
if (err) throw err;
else {
var file_name = url.parse(file_url).pathname.split('/').pop();
var file = fs.createWriteStream(DOWNLOAD_DIR + file_name);
var options =
{ method: 'GET',
url: file_url,
headers:
{authorization: '<your auth>'}
};
request(options).pipe(file); /* This line does the trick */
console.log(file_name + ' downloaded to ' + DOWNLOAD_DIR);
}
});