Node.js 批量下载图片

前言

最近接手一个项目,是一个兄弟公司写的,使用PHP的ThinkPHP做的前后端在一起的项目。代码是别人搞到服务器上面去的,突然那边的整个技术部解散了,而我们这边在此之前我还没看见过代码。项目虽说部署到了服务器上,且可以打开,但是一堆bug。
没办法只好硬着头皮在线上修改。之前也就是换了两天时间在本地把PHP环境搭建过。还算好,在一天之内修改而几个bug,使得项目在上线的时候,没有明显的bug了。接下来就是在使用的过程中发现的有限业务逻辑的bug,还算好,那边离职的那位技术负责人在帮我们修改,就这样,前后不到一周时间,项目基本可以正常运行了。

问题

但是老板一直说微信商城的首页打开比较慢,首页也确实打开比较慢。这个问题由于不是最急的所以,到了今天我才修改。其实代码方面并没有修改,之前那边的开发还说代码里面在图片上传的时候压缩过图片了,我在他们的代码里面并没发现压缩处理的代码。我们公司这边上传图片的人,也没先压缩图片再上传。项目已经上线,图片也有1583张,涉及到的产品有240多个。不可能再重新上传图片了。
之前首页有130张左右的图片,每张图片最小有120K,最大500多K,这是一件很可怕的事情。一个首页的图片就有最少15M大小,这样的首页打开速度能不慢才怪。由于代码已经写好了,图片也上传到阿里云的OSS上面了。现在能做的首先就是把阿里云OSS上的图片压缩一次再重新批量上传上去。

批量下载图片

还好项目里面有一个表示专门存放图片地址的。这样我就可以先把图片批量下载下来,在使用工具压缩之后再上传到阿里云OSS上面去。
其实图片的批量下载很简单。主要是require模块的使用。
代码如下:


var express = require('express');
var router = express.Router();
var fs = require('fs');
var request = require('request');
var async = require("async");

// 导入MySQL模块  

var mysql = require('mysql');
var pool = mysql.createPool({
        host: '数据库IP地址',
        user: '数据库用户名', 
        password: '数据库密码',  
        database: '数据库名',
        multipleStatements: true,
        port: '数据库端口'
})

router.all('/api/imgstore', function(req, res, next){
    pool.getConnection(function(err, connection) {
        if(err){
            res.end(JSON.stringify(err));
            return;
        }
        connection.query('select * from 表名;',function (err, results) {
            connection.release();
            if (err){
                throw err
            }else{
                async.each(results,function iteratee(item, callback){
                    // 获取图片地址
                    var urls = item.imgpath;
                    // 获取图片名字
                    var objName = urls.split('Uploads/')[1];
                    // 构建目标路径
                    var basePath = './tmp/';  
                    var targetPath = basePath+ "/tmp"; 
                    // 下载图片 
                    download(urls,basePath, objName);  
                })
            }
        })
    })
});

// 图片下载
// uri:图片网络地址
// dir:目标路径
// filename:图片名字
function download(uri, dir,filename){  
    request.head(uri, function(err, res, body){  
        request(uri).pipe(fs.createWriteStream(dir + "/" + filename));  
    });  
}; 

module.exports = router;

就这样整个阿里云OSS上下的1583张图片就全部下载下来了。

压缩图片

压缩图片这个关于Node.js的代码还没发现合适的,所以采取的使用工具手动压缩的。
https://tinypng.com/这个工具其实也是很好用的。之前一直使用这个,但是这次没有使用。因为他一次只能上传20张,这里有1583张,速度也比较慢。
这次使用的是智图。智图有客户端,我是使用客户端压缩的,一次上传800张没问题,就这样两次就搞定了。
最后综合对比一下那些120K以上的图,基本压缩了60%以上,那些50K左右的图,也变小了好几K。整体来说效果是很明显了。
剩下的就是使用阿里云的OSS工具批量上传了,这个一次搞定,只是需要等几分钟。

最后

在不修改任何线上代码的情况下,就将整个项目里面的图片全部压缩的一次,这个耗时不过两个小时,且用户不会发现异常。工作效率还是很高的。首页打开速度明显快了一倍。这样其他详情页面打开速度也会加快。
但是这是在只有1583张图片的前提下,整个过程花了不到两个小时,如果后面再有几个0,那么这个工程是巨大的,效率也并不高。所以最终还是要通过代码处理。
现在目前能做的就是,要求上传图片的同事在上传产品图片的之前必须要先压缩一次再上传。
关于智图的API–gulp-imageisux。也研究了一下,发现不怎么好用,处理单个图片还好,批量就弱了一些。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值