Files
huishou/upload-full.js
T
2026-07-27 13:37:48 +08:00

63 lines
2.2 KiB
JavaScript

const { Client } = require('ssh2');
const fs = require('fs');
const path = require('path');
const conn = new Client();
const localDir = path.join(__dirname, 'dist', 'build', 'h5');
const remoteDir = '/www/huishou/dist/build/h5';
let uploadedCount = 0;
function uploadDir(sftp, local, remote, cb) {
fs.readdir(local, { withFileTypes: true }, (err, entries) => {
if (err) { cb(err); return; }
let done = 0, hasErr = false;
if (entries.length === 0) { cb(null); return; }
entries.forEach(e => {
const lp = path.join(local, e.name);
const rp = remote + '/' + e.name;
if (e.isDirectory()) {
sftp.mkdir(rp, { recursive: true }, (me) => {
if (me && me.code !== 4) console.log('mkdir err:', me);
uploadDir(sftp, lp, rp, (de) => {
if (de) { hasErr = true; cb(de); }
if (++done === entries.length && !hasErr) cb(null);
});
});
} else {
fs.readFile(lp, (re, content) => {
if (re) { hasErr = true; cb(re); return; }
sftp.createWriteStream(rp).on('close', () => {
uploadedCount++;
console.log('上传:', rp);
if (++done === entries.length && !hasErr) cb(null);
}).on('error', (we) => { hasErr = true; cb(we); }).end(content);
});
}
});
});
}
conn.on('ready', () => {
console.log('连接成功,开始清理旧文件...');
conn.exec(`rm -rf ${remoteDir}/*`, (err) => {
if (err) { console.log('清理失败:', err); conn.end(); return; }
console.log('旧文件已清理,开始上传...');
conn.sftp((err, sftp) => {
if (err) { console.log('SFTP err:', err); conn.end(); return; }
uploadDir(sftp, localDir, remoteDir, (err2) => {
if (err2) { console.log('上传失败:', err2); }
else {
console.log(`上传完成!共上传 ${uploadedCount} 个文件`);
conn.exec('/www/server/nginx/sbin/nginx -s reload', () => {
console.log('Nginx已重启');
sftp.end();
conn.end();
});
}
});
});
});
});
conn.connect({ host: 'hs.yifenbao.cn', port: 22, username: 'root', password: 'Torch1112' });