源码地址
oss 上传辅助工具
解决问题:减少手动压缩上传oss
- 将需要上传的图片内容放置在
src
文件夹中
- 压缩后的文件会保存到
.data
文件夹中
up
:单纯压缩上传,不处理 src
文件
cp
:复制 src
到 .data
中
rm
:删除 src
内容
u
:npm run up && npm run cp && npm run rm
conf.js
处理输入输出路径配置
1 2 3 4 5 6 7 8 9
| const dir = __dirname.replace('scripts', '') const target = __dirname.replace('scripts', '.data') const source = __dirname.replace('scripts', 'src')
module.exports = { source, target, dir }
|
util.js
定义函数访问文件和文件夹
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
| const { readdir, statSync } = require('fs') const { join } = require('path')
const noop = () => {}
const findBySource = path => { return new Promise(resolve => { readdir(path, async (err, files) => { resolve({ files: files.map(file => join(path, file)), path }) }) }) }
const resolveFile = (file, dirCb = noop, fileCb = noop) => { let stat = statSync(file) if(stat.isDirectory()){ dirCb(file) }else if(stat.isFile()){ fileCb(file) } }
module.exports = { findBySource, resolveFile }
|
cp.js
用于复制文件到目标文件夹
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
| const { join } = require('path') const { source, target } = require('./conf') const { findBySource, resolveFile } = require('./util') const { cp, mkdir, rm } = require('shelljs')
const cb = ({ files }) => { return new Promise(async resolve => { files.map(async file => { let targetFile = join(target, file.replace(source, '')) resolveFile(file, () => { mkdir(targetFile) findBySource(file).then(cb).then(() => { }) }, () => { rm('-rf', targetFile) cp('-R', file, targetFile) }) }) resolve() }) }
findBySource(source).then(cb)
|
rm.js
用于删除文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| const { findBySource, resolveFile } = require('./util') const { source } = require('./conf') const { rm } = require('shelljs')
const rmCb = file => rm('-rf', file)
const cb = ({ files }) => { return new Promise(async resolve => { files.map(async file => resolveFile(file, rmCb, rmCb)) resolve() }) }
findBySource(source).then(cb)
|
up.js
用于压缩上传到 oss
,具体 oss
配置需要自行配置
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
| const fs = require('fs'); const { mkdir } = require('shelljs') const { source, target, dir } = require('./conf') const { findBySource, resolveFile } = require('./util')
const sizeOf = require('image-size'); const imagemin = require('imagemin'); const imageminJpegtran = require('imagemin-jpegtran'); const imageminPngquant = require('imagemin-pngquant');
const date = new Date()
const uploadFilePath = `${target}\\${date.getFullYear()}-${date.getMonth()+1}-${date.getDate()}-${date.getHours()}-${date.getMinutes()}-${date.getSeconds()}.txt`
async function put (file) { try { console.log('---- upload ----'); console.log(file, file.replace(/.\//ig, '')); } catch (e) { console.log(e); } }
mkdir(target)
let count = 0
let all = 0
let txt = ''
const beforeUploadHook = file => { const size = sizeOf(file) count++ txt += `path: ${file.replace(source, '')}; height: ${size.height}px; width: ${size.width}px; ` if(all === count)fs.writeFileSync(`${uploadFilePath}`, txt) }
const zipImage = async (src, dir) => { return await imagemin([`${src.replace(dir, '').replace('\\', '/')}/*.{jpg,png}`], { destination: src, plugins: [ imageminJpegtran({ progressive:true }), imageminPngquant({ quality: [0.8, 0.9] }) ] }); }
const cb = ({ files, path }) => { return new Promise(async resolve => { zipImage(path, dir) all += files.length files.map(async file => { resolveFile(file, () => { all-- findBySource(file).then(cb) }, async () => { beforeUploadHook(file) put(file) }) }) resolve() }) }
findBySource(source).then(cb)
|