nodejs之文件下载

本文介绍使用Node.js进行图片和视频的下载方法,包括利用request模块、fs模块的不同方法及http请求等方式实现资源下载。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

==========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实现文件下载=========

参考:nodejs之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("请求失败");
   });
 });





评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值