dashboard/upload.js
“zhuzihan”  f549b084a8 合并view
2025-07-10 17:14:40 +08:00

78 lines
2.3 KiB
JavaScript

import SftpClient from 'ssh2-sftp-client';
import path from 'path';
import fs from 'fs/promises'; // 使用 fs 的 Promise 版本
import { fileURLToPath } from 'url';
// 如果使用环境变量,取消下面这行的注释
// require('dotenv').config();
// 获取当前模块的文件路径
const __filename = fileURLToPath(import.meta.url);
// 获取当前模块所在的目录路径
const __dirname = path.dirname(__filename);
const config = {
// 如果使用环境变量
// host: process.env.SFTP_HOST,
// port: parseInt(process.env.SFTP_PORT) || 22,
// username: process.env.SFTP_USER,
// password: process.env.SFTP_PASS,
// 直接配置
host: '36.103.203.89',
port: 22,
username: 'liuyang',
password: 'Asdf!234',
// 或者使用私钥认证
// privateKey: fs.readFileSync('/path/to/your/key')
};
// 本地打包目录
const localDir = path.join(__dirname, 'dist');
// 服务器目标目录
// const remoteDir = process.env.SFTP_REMOTE_DIR; // 如果使用环境变量
const remoteDir = '/home/ubuntu/mnt/teacher_test/nginx-1/dist';
async function uploadToServer() {
const sftp = new SftpClient();
try {
console.log('开始连接服务器...');
await sftp.connect(config);
console.log('连接成功,检查远程目录是否存在...');
const exists = await sftp.exists(remoteDir);
if (exists) {
console.log('清空远程目录中的内容...');
// 获取远程目录中的所有文件和文件夹
const remoteList = await sftp.list(remoteDir);
// 依次删除每个文件和文件夹
for (const item of remoteList) {
const remotePath = `${remoteDir}/${item.name}`;
if (item.type === 'd') {
// 如果是目录,递归删除
await sftp.rmdir(remotePath, true);
} else {
// 如果是文件,直接删除
await sftp.delete(remotePath);
}
}
} else {
console.log('远程目录不存在,创建目录...');
await sftp.mkdir(remoteDir, true);
}
console.log('开始上传文件...');
await sftp.uploadDir(localDir, remoteDir);
console.log('文件上传完成!');
return true;
} catch (err) {
console.error('上传过程中发生错误:', err);
return false;
} finally {
sftp.end();
}
}
uploadToServer();