前端前端
fabric
算法
jsBlock
styleBlock
svgBlock
工具其他
Vue、React相关
webgl
GitHub
fabric
算法
jsBlock
styleBlock
svgBlock
工具其他
Vue、React相关
webgl
GitHub
  • parseInt
  • preventDefault报错
  • promise
  • requestIdleCallback
  • undefined
  • webworker
  • 代码块
  • 前后端自动刷新
  • 多个标签页通讯
  • 实现个简单爬虫
  • 执行上下文
  • 控制台
  • 查找文件中的图片并下载
  • 深度广度优先
  • 累加函数
  • 触摸事件和键盘事件

查找文件中的图片并下载

腾讯云上的图片转移到其他地方,查找所有vue.js文件,把其中的图片下载下来

'use strict';
const path = require('path');
const fs = require('fs');
var http = require('http');
var https = require('https');


module.exports = function (router) {
  router.get('/down', (req, res, next) => {
    var basePath = path.resolve(__dirname, '../xxx/src')
    const arr = fileDisplay(basePath)
    const filterArr = filterFiles(arr, ['vue', 'js'])
    const imgUrls = getImgUrl(filterArr)
    batchDownLoad(imgUrls)
    res.send({ name: '测试下载' })
  });
};

// 根据文件夹获取所有文件
function fileDisplay(filePath) {
  let arr = []
  let files = fs.readdirSync(filePath)
  files.forEach(function (filename) {
    let filedir = path.join(filePath, filename);
    let stats = fs.statSync(filedir)
    let isFile = stats.isFile();//是文件
    let isDir = stats.isDirectory();//是文件夹
    if (isFile) {
      arr.push(filedir);
    }
    if (isDir) {
      const childArr = fileDisplay(filedir); // 递归,如果是文件夹,就继续遍历该文件夹下面的文件
      arr = arr.concat(childArr)
    }
  });
  return arr
}

// 筛选符合条件的文件
function filterFiles(arr, types) {
  const filterArr = []
  arr.forEach(element => {
    const fileType = element.substring(element.lastIndexOf('.') + 1)
    if (types.indexOf(fileType) > -1) {
      filterArr.push(element)
    }
  });
  return filterArr
}

// 读取文件内容,筛选出图片地址
function getImgUrl(filePathArr) {
  let imgArr = []
  const reg = /(https|http):\/\/resource\.xxx\.com\/.*?\.(jpg|jpeg|png|bmp)/ig
  filePathArr.forEach((file, i) => {
    var data = fs.readFileSync(file, "utf-8")
    const imgs = data.match(reg)
    if (imgs) {
      imgArr = imgArr.concat(imgs)
    }
  });
  console.log(imgArr.length, imgArr)
  return imgArr
}

// 根据图片地址批量下载文件
function batchDownLoad(imgUrls) {
  var basePath = path.resolve(__dirname, '../download/')
  for (let i = 0; i < imgUrls.length; i++) {
    const img = imgUrls[i];
    const fileName = img.substring(img.lastIndexOf('/') + 1)
    downloadFileAsync(img, path.join(basePath, fileName))
  }
}

// 根据图片地址下载文件
function downloadFileAsync(uri, dest) {
  return new Promise((resolve, reject) => {
    const file = fs.createWriteStream(dest);
    var protocol = (uri.match(/^https:\/\//i) ? https : http);
    protocol.get(uri, (res) => {
      if (res.statusCode !== 200) {
        reject(response.statusCode);
        return;
      }

      res.on('end', () => {
        console.log('download end');
      });

      // 进度、超时等

      file.on('finish', () => {
        console.log('finish write file')
        file.close(resolve);
      }).on('error', (err) => {
        fs.unlink(dest);
        reject(err.message);
      })

      res.pipe(file);
    });
  });
}
Edit this page
最近更新:: 2021/5/26 17:52
Contributors: wuhui
Prev
控制台
Next
深度广度优先