Nodejs实现图片上传、压缩预览、定时删除功能


Posted in NodeJs onOctober 25, 2019

前言

我们程序员日常都会用到图片压缩,面对这么常用的功能,肯定要尝试实现一番。

第一步,node基本配置

这里我们用到的是koa框架,它可是继express框架之后又一个更富有表现力、更健壮的web框架。

1、引入基本配置

const Koa = require('koa');// koa框架
const Router = require('koa-router');// 接口必备
const cors = require('koa2-cors'); // 跨域必备
const tinify = require('tinify'); // 图片压缩
const serve = require('koa-static'); // 引入静态文件处理
const fs = require('fs'); // 文件系统
const koaBody = require('koa-body'); //文件保存库
const path = require('path'); // 路径

2、使用基本配置

let app = new Koa();
let router = new Router();
tinify.key = ''; // 这里需要用到tinify官网的KEY,要用自己的哦,下面有获取key的教程。

//跨域
app.use(cors({
  origin: function (ctx) {
    return ctx.header.origin;
  },
  exposeHeaders: ['WWW-Authenticate', 'Server-Authorization'],
  maxAge: 5,
  credentials: true,
  withCredentials: true,
  allowMethods: ['GET', 'POST', 'DELETE'],
  allowHeaders: ['Content-Type', 'Authorization', 'Accept'],
}));
// 静态处理器配置
const home = serve(path.join(__dirname) + '/public/');
app.use(home);

//上传文件限制
app.use(koaBody({
  multipart: true,
  formidable: {
    maxFileSize: 200 * 1024 * 1024 // 设置上传文件大小最大限制,默认2M
  }
}));

3、tinify官网的key获取方式

获取链接

输入你名字跟邮箱,点击 Get your API key , 就可以了。

注意: 这个API一个月只能有500次免费的机会,不过我觉得应该够了。

第二步,详细接口配置

我们要实现图片上传以及压缩,下面我们将要实现。

1、上传图片

var new1 = '';
var new2 = '';
// 上传图片
router.post('/uploadPic', async (ctx, next) => {
  const file = ctx.request.files.file; // 上传的文件在ctx.request.files.file
  // 创建可读流
  const reader = fs.createReadStream(file.path);
  // 修改文件的名称
  var myDate = new Date();
  var newFilename = myDate.getTime() + '.' + file.name.split('.')[1];
  var targetPath = path.join(__dirname, './public/images/') + `${newFilename}`;
  //创建可写流
  const upStream = fs.createWriteStream(targetPath);
  new1 = targetPath;
  new2 = newFilename;
  // 可读流通过管道写入可写流
  reader.pipe(upStream);
  //返回保存的路径
  console.log(newFilename)
  ctx.body ="上传成功"
});

2、压缩图片以及定时删除图片

// 压缩图片
router.get('/zipimg', async (ctx, next) => {
  console.log(new1);
   let sourse = tinify.fromFile(new1); //输入文件
   sourse.toFile(new1); //输出文件
   // 删除指定文件
   setTimeout(() => {
     fs.unlinkSync(new1);
   }, 20000);
   // 删除文件夹下的文件
   setTimeout(() => {
     deleteFolder('./public/images/')
   }, 3600000);
  let results = await change(new1);
  ctx.body = results
});
// 压缩完成替换原图
const change = function (sql) {
  return new Promise((resolve) => {
       fs.watchFile(sql, (cur, prv) => {
         if (sql) {
           // console.log(`cur.mtime>>${cur.mtime.toLocaleString()}`)
           // console.log(`prv.mtime>>${prv.mtime.toLocaleString()}`)
           // 根据修改时间判断做下区分,以分辨是否更改
           if (cur.mtime != prv.mtime) {
             console.log(sql + '发生更新')
             resolve(new2)
           }
         }
       })
  })
}
// 删除指定文件夹的图片
function deleteFolder(path) {
  var files = [];
  if (fs.existsSync(path)) {
    if (fs.statSync(path).isDirectory()) {
      files = fs.readdirSync(path);
      files.forEach(function (file, index) {
        var curPath = path + "/" + file;
        if (fs.statSync(curPath).isDirectory()) {
          deleteFolder(curPath);
        } else {
          fs.unlinkSync(curPath);
        }
      });
      // fs.rmdirSync(path);
    } 
    // else {
    //   fs.unlinkSync(path);
    // }
  }
}

3、端口配置

app.use(router.routes()).use(router.allowedMethods());
app.listen(6300)
console.log('服务器运行中')

第三步,前台页面配置

实现了后台的配置,那么我们将要展示实现它,页面有点low,只是为了实现基本的功能。

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>压缩图片</title>
  <style>
    h3{ text-align: center; }
    #progress { height: 20px; width: 500px; margin: 10px 0; border: 1px solid gold; position: relative; }
    #progress .progress-item { height: 100%; position: absolute; left: 0; top: 0; background: chartreuse; transition: width .3s linear; }
    .imgdiv{ width: 400px; text-align: center; display: none; }
    .imgdiv img{ width: 100%; }
</style>
</head>
<body>
  <h3>压缩图片</h3>
  <input type="file" id="file" accept="image/*">
  <div style="margin: 5px 0;">上传进度:</div>
  <div id="progress">
    <div class="progress-item"></div>
  </div>
  <p class="status" style="display: none;"></p>
  <div class="imgdiv">
    <img src="" alt="" class="imgbox">
  </div>
  <div class="bbt">
    <button class="btn" style="display: none;">压缩</button>
  </div>
</body>
<script>
  //上传图片
  document.querySelector("#file").addEventListener("change", function () {
    var file = document.querySelector("#file").files[0];
    var formdata = new FormData();
    formdata.append("file", file);
    var xhr = new XMLHttpRequest();
    xhr.open("post", "http://localhost:6300/uploadPic/");
    xhr.onreadystatechange = function () {
      if (xhr.readyState == 4 && xhr.status == 200) {
        document.querySelector('.btn').style.display = "block";
        document.querySelector('.status').style.display = "block";
        document.querySelector('.status').innerText=xhr.responseText
      }
    }
    xhr.upload.onprogress = function (event) {
      if (event.lengthComputable) {
        var percent = event.loaded / event.total * 100;
        document.querySelector("#progress .progress-item").style.width = percent + "%";
      }
    }
    xhr.send(formdata);
  });
  // 压缩图片
  document.querySelector('.btn').onclick = function () {
    document.querySelector('.status').innerText='等待中......'
    var xhr = new XMLHttpRequest();
    xhr.open("get", "http://localhost:6300/zipimg/");
    xhr.send();
    xhr.onreadystatechange = function () {
      if (xhr.readyState == 4 && xhr.status == 200) {
        document.querySelector('.imgdiv').style.display = "block";
        document.querySelector('.status').innerText='压缩成功'
        document.querySelector(".imgbox").setAttribute('src', './images/' + xhr.responseText)
        document.querySelector('.btn').style.display = "none";
      }
    }
  }
</script>
</html>

总结

以上所述是小编给大家介绍的Nodejs实现图片上传、压缩预览、定时删除功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

NodeJs 相关文章推荐
在NodeJS中启用ECMAScript 6小结(windos以及Linux)
Jul 15 NodeJs
windows下安装nodejs及框架express
Aug 07 NodeJs
基于html5和nodejs相结合实现websocket即使通讯
Nov 19 NodeJs
搭建简单的nodejs http服务器详解
Mar 09 NodeJs
详解nodejs微信jssdk后端接口
May 25 NodeJs
详解nodejs异步I/O和事件循环
Jun 07 NodeJs
nodejs 图片预览和上传的示例代码
Sep 30 NodeJs
nodeJS模块简单用法示例
Apr 21 NodeJs
nodejs中用npm初始化来创建package.json的实例讲解
Oct 10 NodeJs
nodejs使用socket5进行代理请求的实现
Feb 21 NodeJs
nodejs脚本centos开机启动实操方法
Mar 04 NodeJs
详解nodejs内置模块
May 06 NodeJs
nodejs语言实现验证码生成功能的示例代码
Oct 13 #NodeJs
NodeJS有难度的面试题(能答对几个)
Oct 09 #NodeJs
Nodejs监控事件循环异常示例详解
Sep 22 #NodeJs
详解利用nodejs对本地json文件进行增删改查
Sep 20 #NodeJs
nodejs实现聊天机器人功能
Sep 19 #NodeJs
图解NodeJS实现登录注册功能
Sep 16 #NodeJs
详解NodeJs项目 CentOs linux服务器线上部署
Sep 16 #NodeJs
You might like
PHP数组内存耗用太多问题的解决方法
2010/04/05 PHP
PHP执行linux系统命令的常用函数使用说明
2010/04/27 PHP
php下利用curl判断远程文件是否存在的实现代码
2011/10/08 PHP
解析使用ThinkPHP应该掌握的调试手段
2013/06/20 PHP
php防止sql注入示例分析和几种常见攻击正则表达式
2014/01/12 PHP
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 2611816 bytes)
2014/11/08 PHP
PHP中Session和Cookie是如何操作的
2015/10/10 PHP
PHP parse_ini_file函数的应用与扩展操作示例
2019/01/07 PHP
PHPstorm激活码2020年5月13日亲测有效
2020/09/17 PHP
自用js开发框架小成 学习js的朋友可以看看
2010/11/16 Javascript
JS教程:window.location使用方法的区别介绍
2013/10/04 Javascript
Javascript 遍历页面text控件详解
2014/01/06 Javascript
jquery 通过name快速取值示例
2014/01/24 Javascript
分享自己用JS做的扫雷小游戏
2016/02/17 Javascript
编写高质量JavaScript代码的基本要点
2016/03/02 Javascript
javascript模块化简单解析
2016/04/07 Javascript
JS生成某个范围的随机数【四种情况详解】
2016/04/20 Javascript
JS实现颜色梯度与渐变效果完整实例
2016/12/30 Javascript
详解Angular 4.x NgIf 的用法
2017/05/22 Javascript
js 简易版滚动条实例(适用于移动端H5开发)
2017/06/26 Javascript
JavaScript实现JSON合并操作示例【递归深度合并】
2018/09/07 Javascript
javascript实现点亮灯泡特效示例
2019/10/15 Javascript
详解小程序如何改变onLoad的执行时机
2019/11/01 Javascript
js轮播图之旋转木马效果
2020/10/13 Javascript
Python提取支付宝和微信支付二维码的示例代码
2019/02/15 Python
html5视频播放_动力节点Java学院整理
2017/07/13 HTML / CSS
百联网上商城:i百联
2017/01/28 全球购物
泰国健康和美容服务预订网站:GoWabi
2019/06/03 全球购物
名词解释型面试题(主要是网络)
2013/12/27 面试题
酒店保洁主管岗位职责
2013/11/28 职场文书
房屋买卖协议书
2014/04/10 职场文书
医学生求职信
2014/07/01 职场文书
2014年英语教研组工作总结
2014/12/06 职场文书
2015年村党支部工作总结
2015/04/30 职场文书
Python 文字识别
2022/05/11 Python
MySQL常用慢查询分析工具详解
2022/08/14 MySQL