管不工作

时间:2015-06-10 19:20:15

标签: node.js request

我有一个用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);
}  

2 个答案:

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