nodejs之檔案下載
阿新 • • 發佈:2019-02-06
==========request模組實現下載========
***********app.js*************
var express = require('express'); var app = express();//建立express例項 var routes=require('./routes/routes.js');//吧路由引入; ./ 代表專案的當前總目錄 /Users/wofu/Desktop/node routes.router(app);//呼叫路由 var server = app.listen(8081, function () { var host = server.address().address var port = server.address().port console.log(__dirname);//這裡的目錄就是/Users/wofu/Desktop/node,其中node資料夾我是直接放在了桌面 console.log(host);//主機地址 console.log(port);//埠號 console.log("應用例項,訪問地址為 http://%s:%s", host, port) })
***********routes.js***************
var router = function(app){
var fs = require("fs");
var request = require('request');
app.get('/one', function(req, res){
//下載圖片-------下載網路資源(就是路徑是http://開頭的)
var img_src = 'http://img.taopic.com/uploads/allimg/120727/201995-120HG1030762.jpg'; //獲取圖片的url
//採用request模組,向伺服器發起一次請求,獲取圖片資源
request.head(img_src,function(err,res,body){
if(err){
console.log(err);
}
});
var img_filename = 'mu01.jpg';
request(img_src).pipe(fs.createWriteStream('/Users/wofu/Desktop/'+ img_filename));
console.log("第一個網頁");
res.send("diyi")
});
};
exports.router = router;
================http.request實現檔案下載=========
==============fs.writeFile實現下載圖片======
***********app.js***********
var express = require('express'); var app = express();//建立express例項 var routes=require('./routes/routes.js');//吧路由引入; ./ 代表專案的當前總目錄 /Users/wofu/Desktop/node routes.router(app);//呼叫路由 var server = app.listen(8081, function () { var host = server.address().address var port = server.address().port console.log(__dirname);//這裡的目錄就是/Users/wofu/Desktop/node,其中node資料夾我是直接放在了桌面 console.log(host);//主機地址 console.log(port);//埠號 console.log("應用例項,訪問地址為 http://%s:%s", host, port) })
***********routes.js**************讀取的是伺服器本地的資源
var router = function(app){
var fs = require("fs");
app.get('/one', function (req, res) {
console.log("第一個網頁");
//讀取圖片
//第一個引數是下載的資源的url,第二個引數binary(以二進位制輸出到瀏覽器,瀏覽器能自動解析),如果是圖片必須設定成binary,否則圖片打不開
// 如果是hex(以16進位制輸出到瀏覽器,在瀏覽器顯示的是16進位制字串)
//第三個引數是回撥函式,data是讀取的資料
fs.readFile("/Users/wofu/Desktop/node/temp/1a1f92b4b73412376e2e158bca4021e0","binary",function(err,data){
if(err){
console.log(err);
return;
}else {
res.write(data,"binary");//圖片顯示在瀏覽器上
//吧圖片儲存在本地
//第一個引數是要儲存的路徑url;第二個是是要儲存的資料,第三個引數是以二進位制儲存,第四個是回撥函式
fs.writeFile("/Users/wofu/Desktop/logonew.png", data, "binary", function(err){
if(err){
console.log("down fail");
}
console.log("down success");
});
res.end("");
}
});
});
};
exports.router = router;
*****************fs.createReadStream實現下載******************
下載的是伺服器本地的資源;
var stream = fs.createReadStream( "/Users/wofu/Desktop/node/temp/1a1f92b4b73412376e2e158bca4021e0" );//引數是圖片資源路徑
var responseData = [];//儲存檔案流
if (stream) {//判斷狀態
stream.on( 'data', function( chunk ) {
responseData.push( chunk );
});
stream.on( 'end', function() {
var finalData = Buffer.concat( responseData );
res.write( finalData );
//第一個引數是下載下來要存放的位置,第二個引數是圖片資料(二進位制的),第三個引數必須要binary,第四個是回撥函式
fs.writeFile("/Users/wofu/Desktop/logonew02.png", finalData, "binary", function(err){
if(err){
console.log("下載失敗");
}
console.log("下載成功");
});
res.end();
});
}
*********視訊下載和圖片下載類似***************
var stream = fs.createReadStream( "/Users/wofu/Desktop/node/temp/test.mov" );//引數是圖片、視訊資源路徑
var responseData = [];//儲存檔案流
if (stream) {//判斷狀態
stream.on( 'data', function( chunk ) {
responseData.push( chunk );
});
stream.on( 'end', function() {
var finalData = Buffer.concat( responseData );
res.write( finalData.toString("base64")); //傳給app,base64 必須要是data二進位制型別,一般在實際應用中,app吧圖片或視訊資源轉換成data二進位制後base64編碼成字串上傳資源給伺服器,伺服器吧二進位制資料解析成視訊或圖片放到一個目錄,建立相應的url放到資料庫;app取的時候獲取到的是url;
//第一個引數是下載下來要存放的位置,第二個引數是圖片、視訊資料(二進位制的),第三個引數必須要binary,第四個是回撥函式
fs.writeFile("/Users/wofu/Desktop/logonew02.mov", finalData, "binary", function(err){
if(err){
console.log("下載失敗");
}
console.log("下載成功");
});
res.end();
});
}
******************pipe 管道流實現下載*****************下載網路資源
var request = require('request');
var fs =require('fs');
request("https://www.baidu.com/img/baidu_jgylogo3.gif").pipe(fs.createWriteStream("/Users/wofu/Desktop/logonew05.png"));
******************http請求資源**********************
var req = http.get("https://www.baidu.com/img/baidu_jgylogo3.gif", function (res) {
var imgData = "";
res.setEncoding("binary"); //一定要設定response的編碼為binary否則會下載下來的圖片打不開
res.on("data", function (chunk) {
imgData += chunk;
});
res.on("end", function () {
fs.writeFile("/Users/wofu/Desktop/logonew06.png", imgData, "binary", function (err) {
if (err) {
console.log("儲存失敗");
}
console.log("儲存成功");
});
});
res.on("error", function (err) {
console.log("請求失敗");
});
});
******************http請求網路圖片,並且base64編碼成字串返回給app*****
var req = http.get("https://www.baidu.com/img/baidu_jgylogo3.gif", function (ress) {
//注意這裡的ress和res的區別,這裡的ress又是當前的網路請求的響應,res是最外層的網路請求響應
var imgData = "";
ress.setEncoding("binary"); //一定要設定response的編碼為binary否則會下載下來的圖片打不開
ress.on("data", function (chunk) {
imgData += chunk;
});
ress.on("end", function () {
var st=Buffer.from(imgData,"binary").toString("base64");//吧下載的圖片二進位制資料放到buffer快取區,然後轉換成base64字串(base64編碼解碼都是針對二進位制資料);
res.end(st);//傳送給app
});
ress.on("error", function (err) {
console.log("請求失敗");
});
});