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。也研究了一下,发现不怎么好用,处理单个图片还好,批量就弱了一些。
Node.js 批量下载图片相关推荐
- node.js批量修改图片名称
var fs = require("fs"); // 这里path是你要读取哪一个目录下的所有文件 var path = 'img' fs.readdir(path, functi ...
- node.js爬虫之下载图片,批量下载图片,控制下载图片并行上限
首先介绍一下爬虫所需要的的包 require("request"); –get post请求页面 require("cheerio") –解析文本对象为DOM对 ...
- JS单个、批量下载图片
<!DOCTYPE html> <html><head><meta charset="utf-8" /><title>& ...
- 用python批量下载网络图片_使用python批量下载图片吗?怎么做?
没想到吧,我们居然可以用python去下载图片,关于单个下载内容,之前已经出了教程告诉大家,大家应该都知道,图片跟文字似的,经常多个发布,我们如果想得到很多个图片,还得一个代码或者一个图片源的去敲击吗 ...
- java实现批量下载图片并打包成zip
今天项目经理让做一个功能,就是批量下载图片,整体思路简单,但遇到了一个坑,需求是根据勾选的checkbox,点击下载按钮,弹出选择不同规格的图片对话框,并在下载完成后关闭对话框.坑就在下载完成后关闭对 ...
- 2021-03-10 Python多线程爬虫快速批量下载图片
Python多线程爬虫快速批量下载图片 1.完成这个需要导入的模块 urllib,random,queue(队列),threading,time,os,json 第三方模块的安装 键盘win+R,输入 ...
- python 批量下载网页图片_Python实现多线程批量下载图片
<派森>(Python)3.13 win32 英文安装版 类型:编程工具大小:21M语言:英文 评分:8.7 标签: 立即下载 爬取图片可真的是一个可遇不可求的机会. 有需求就会动力. 目 ...
- 爬虫小案例:基于Bing关键词批量下载图片(第二版)
一.需求: 基于Bing网站,输入关键词,批量下载图片保存到本地 二.代码展示: import requests from lxml import etree import os from multi ...
- 爬虫小案例:基于Bing关键词批量下载图片
一.需求: 基于Bing网站,输入关键词,批量下载图片保存到本地 二.演示: 三.直接上代码 import os import urllib.request import urllib.parse f ...
最新文章
- (ql)30W单片精密开关电源 电路图加分析
- C++ Primer 5th笔记(chap 17 标准库特殊设施)正则表达式
- “影响100活动”答记者问(二)
- python爬虫课件_Python爬虫教学视频(附课件)
- 组合表头_单双斜线表头——520,想单就单,想双就双
- arm rtx教程_ARM CMSIS标准概述及快速入门
- [转] 没人把程序员当回事儿
- 2021高考青岛二中成绩查询,2021年青岛高考各高中成绩及本科升学率数据排名及分析...
- shell 删除乱码文件
- Java入门系列-22-IO流
- 查看文件_如何在Mac上显示和查看隐藏的文件/文件夹
- C#基础18:内置委托类型Action和Func
- ADO获取表的所有字段名
- 测试开发工程师成长日记001 - 敏捷测试、CI/CD/CT、DecOps的一些介绍
- mysql批量入库values限制_mysql批量插入数据方法
- ThinkPad Tablet2升级Windows10(各种故障及解决方案)
- 路由表的下一跳地址如何计算
- TensorFlow 高级之一(实现单层神经网络)
- 王琪你计算机学院,计算机学院成功举办第四届青春飞扬大赛
- 不小心被拉进QQ诈骗群之后