fix(frontend): 修复文件管理器删除与上传稳定性
补齐文件管理器右键子菜单点击展开,新增拖拽上传目标确认, 并在上传完成后自动刷新当前可见目录 目录删除改为区分仅删空目录与强制递归删除,删除后自动回退 失效路径,避免文件树持续报 No such file 同步后端 sftp:rmdir 的 recursive 分支,并将关于页与版本检查 默认仓库链接切换到 Micah123321/nexus-terminal
This commit is contained in:
@@ -489,16 +489,40 @@ export class SftpService {
|
||||
}
|
||||
}
|
||||
|
||||
/** 删除目录 (强制递归) */
|
||||
async rmdir(sessionId: string, path: string, requestId: string): Promise<void> {
|
||||
/** 删除目录 */
|
||||
async rmdir(sessionId: string, path: string, requestId: string, recursive = true): Promise<void> {
|
||||
const state = this.clientStates.get(sessionId);
|
||||
if (!state || !state.sshClient) {
|
||||
console.warn(`[SSH Exec] SSH 客户端未准备好,无法在 ${sessionId} 上执行 rmdir (ID: ${requestId})`);
|
||||
if (!state || (!state.sshClient && recursive) || (!state.sftp && !recursive)) {
|
||||
console.warn(`[SSH Exec] 会话未准备好,无法在 ${sessionId} 上执行 rmdir (ID: ${requestId})`);
|
||||
state?.ws.send(JSON.stringify({ type: 'sftp:rmdir:error', path: path, payload: 'SSH 会话未就绪', requestId: requestId }));
|
||||
return;
|
||||
}
|
||||
console.debug(`[SSH Exec ${sessionId}] Received rmdir request for ${path} (ID: ${requestId})`);
|
||||
|
||||
if (!recursive) {
|
||||
const sftp = state.sftp;
|
||||
if (!sftp) {
|
||||
state.ws.send(JSON.stringify({ type: 'sftp:rmdir:error', path: path, payload: 'SFTP 会话未就绪', requestId: requestId }));
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
sftp.rmdir(path, (err) => {
|
||||
if (err) {
|
||||
console.error(`[SFTP ${sessionId}] rmdir ${path} failed (ID: ${requestId}):`, err);
|
||||
state.ws.send(JSON.stringify({ type: 'sftp:rmdir:error', path: path, payload: `删除目录失败: ${err.message}`, requestId: requestId }));
|
||||
} else {
|
||||
console.log(`[SFTP ${sessionId}] rmdir ${path} success (ID: ${requestId})`);
|
||||
state.ws.send(JSON.stringify({ type: 'sftp:rmdir:success', path: path, requestId: requestId }));
|
||||
}
|
||||
});
|
||||
} catch (error: any) {
|
||||
console.error(`[SFTP ${sessionId}] rmdir ${path} caught unexpected error (ID: ${requestId}):`, error);
|
||||
state.ws.send(JSON.stringify({ type: 'sftp:rmdir:error', path: path, payload: `删除目录失败: ${error.message}`, requestId: requestId }));
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
// 第一种方案:尝试 rm -rf 命令
|
||||
const tryRmRfCommand = async (isSudo: boolean) => {
|
||||
const commandPrefix = isSudo ? 'sudo ' : '';
|
||||
|
||||
@@ -57,7 +57,7 @@ export async function handleSftpOperation(
|
||||
else throw new Error("Missing 'path' in payload for mkdir");
|
||||
break;
|
||||
case 'sftp:rmdir':
|
||||
if (payload?.path) sftpService.rmdir(sessionId, payload.path, requestId);
|
||||
if (payload?.path) sftpService.rmdir(sessionId, payload.path, requestId, payload?.recursive !== false);
|
||||
else throw new Error("Missing 'path' in payload for rmdir");
|
||||
break;
|
||||
case 'sftp:unlink':
|
||||
@@ -169,4 +169,4 @@ export function handleSftpUploadCancel(ws: AuthenticatedWebSocket, payload: any)
|
||||
return;
|
||||
}
|
||||
sftpService.cancelUpload(sessionId, payload.uploadId);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user