# 查找文件中的图片并下载
腾讯云上的图片转移到其他地方,查找所有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
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