# 查找文件中的图片并下载

腾讯云上的图片转移到其他地方,查找所有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);
    });
  });
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
最后更新时间: 5/26/2021, 5:52:52 PM