2017-04-04 13 views
1

エクスプレスHTTPリクエストの後、ノードアプリケーションから別のサイトからファイルをダウンロードしてからファイルをダウンロードしようとしています。 私は、パイプ、ブロブなどを使用してファイルを取得する複数の方法を試みましたが、私は暗闇の中で握っています、私はいくつかの助けが必要です。コードは、私が達成しようとしているものにとあなたの洞察力のもう少しを与えるかもしれない:HTTP別のサイトからファイルを取得して、エクスプレスでダウンロードして返します。

var router = require('express').Router(); 
var fs = require('fs'); 
var http = require('http'); 

router.get('/download/:file', function (req, res, next) { 
    http.get('http://anothersite/' + req.params.file, function(response) { 
    res.setHeader('Content-disposition', 'attachment; filename=' + req.params.file); 
    res.setHeader('Content-type', 'application/octet-stream'); 
    res.download(fs.createWriteStream(req.params.file).pipe(response)); 
    }); 
}); 

これは私にエラー「パイプすることはできません読めませんが。」を与えます。ファイル自体は通常のファイル形式ではありません(独自の拡張機能を備えたカスタマイズされたソフトウェアのファイルです)。

何が欠けていますか?どんな洞察力にも感謝しています!あなたはHTTPでそれを行うために喜んでいる場合は、以下のように書き込み、ストリームを作成することができます

request('http://anothersite/').pipe(fs.createWriteStream('filename.extension'))

更新:

は、あなたのようにリクエスト・ライブラリを使用することができますあなたの

答えて

1

。 docs herehereを参照してください。

この場合、すでにReadableStreamhere参照)ですので、response引数をコールバックに直接渡すことができます。このように読めるストリームを使用してみてください:

router.get('/download/:file', function (req, res, next) { 
    http.get('http://anothersite/' + req.params.file, function(response) { 
    res.setHeader('Content-disposition', 'attachment; filename=' + req.params.file); 
    res.setHeader('Content-type', 'application/octet-stream'); 
    response.pipe(res); // <-- change here 
    }); 
}); 

このコードは、ノードのV5.0.0と最新のChromeで、働いている:私はときに、ファイルをHTTP-取得への対応はどうすればよい

const express = require('express'); 
const app = express(); 
const http = require('http'); 

app.get('/', (req, res) => { 
    http.get('http://www.fillmurray.com/200/300', (response) => { 
    res.setHeader('Content-disposition', 'attachment; filename=' + 'hello.jpg'); 
    res.setHeader('Content-type', 'application/octet-stream'); 
    response.pipe(res) 
    }); 
}); 

app.listen(3001,() => console.log(('listening :)'))) 
+0

こんにちはaarosilは、実際にファイルではなく[object Object]をダウンロードしたファイルに入れているようです。何かご意見は? – BelgoCanadian

+0

こんにちは!それでも問題が解決しない場合は、 '[object Object]'を出力するコードをコピー/ペーストできますか?ありがとうございました!!! – aarosil

+0

ダウンロードしたファイルにあります - >メモ帳でファイルを開くと、[オブジェクトオブジェクト]と表示されます。私はあなたのコードを手紙に使っています。 – BelgoCanadian

0

に感謝します。ファイルを正常に保存したら、res.download()を正しく実行できると思います。あなたはエクスプレスresオブジェクトは、ノードのWritableStreamインタフェースを実装そのものである、ノードのhttp.ServerResponseから導出され、書き込み可能な

、ここで読めるストリームを使用する必要はありません1については

var http = require('http') 

http.get('http://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png').on('response', function (response) { 
    var writeStream = fs.createWriteStream('output.png'); 

    response.pipe(writeStream); 

    response.on('end', function() { 
     console.log('stream completed!') 
    }); 

    // This is here incase any errors occur 
    writeStream.on('error', function (err) { 
     console.log(err); 
    }); 

}); 
+0

こんにちはTolsee、私はリクエストを使用しますか? – BelgoCanadian

+0

次のようにgetをパイプすることができます: 'request .get( 'http://google.com/doodle.png') .on( 'error'、function(err){ console.log(err ) } .pipe(res) ' – Tolsee

+0

私はそれを得ることはできません、私はAarosilのソリューションと同じ問題を抱えています。ダウンロードしたファイルは、他のサーバーから入手した元のファイルではありません。 – BelgoCanadian

関連する問題