Node.js使用内容处置作为文件名下载文件

use*_*326 24 request node.js

我正在使用Request模块下载文件,但是当文件名必须来自'Content-Disposition'标题时,我不太确定如何将响应传递给输出流.基本上,我需要读取响应,直到找到标头,然后将其余部分传递给该文件名.

示例显示如下:

request('http://google.com/doodle.png').pipe(fs.createWriteStream('doodle.png'));

我想去的地方(伪代码):

var req = request('http://example.com/download_latest_version?token=XXX');
var filename = req.response.headers['Content-Disposition'];

req.pipe(fs.createWriteStream(filename));
Run Code Online (Sandbox Code Playgroud)

我可以使用Request回调获取文件名:

request(url, function(err, res, body) {
 // get res headers here
});
Run Code Online (Sandbox Code Playgroud)

但这不会否定使用管道的好处而不是将下载的文件加载到内存中吗?

kbe*_*erg 31

我正在从雅虎请求一个图像,它没有使用content-disposition标题,但我正在提取datecontent-type标题来构造一个文件名.这看起来足够接近你想要做的......

var request = require('request'),
fs = require('fs');

var url2 = 'http://l4.yimg.com/nn/fp/rsz/112113/images/smush/aaroncarter_635x250_1385060042.jpg';

var r = request(url2);

r.on('response',  function (res) {
  res.pipe(fs.createWriteStream('./' + res.headers.date + '.' + res.headers['content-type'].split('/')[1]));

});
Run Code Online (Sandbox Code Playgroud)

请忽略我的形象选择:)


Sir*_*rko 13

问题已经存在了一段时间,但我今天面临同样的问题并以不同的方式解决了它:

var Request = require( 'request' ),
    Fs = require( 'fs' );

// RegExp to extract the filename from Content-Disposition
var regexp = /filename=\"(.*)\"/gi;

// initiate the download
var req = Request.get( 'url.to/somewhere' )
                 .on( 'response', function( res ){

                    // extract filename
                    var filename = regexp.exec( res.headers['content-disposition'] )[1];

                    // create file write stream
                    var fws = Fs.createWriteStream( '/some/path/' + filename );

                    // setup piping
                    res.pipe( fws );

                    res.on( 'end', function(){
                      // go on with processing
                    });
                 });
Run Code Online (Sandbox Code Playgroud)