1. 程式人生 > >nodejs之檔案下載

nodejs之檔案下載

==========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("請求失敗");
   });
 });