增加定时清理回收站文件

This commit is contained in:
2026-04-03 22:33:17 +08:00
parent 97f1482497
commit d008278b6a
3 changed files with 75 additions and 14 deletions

View File

@@ -2,22 +2,59 @@ package com.filesystem.config;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.multipart.MaxUploadSizeExceededException;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;
@RestControllerAdvice
public class GlobalExceptionHandler {
/**
* 处理文件上传大小超限异常
*/
@ExceptionHandler(MaxUploadSizeExceededException.class)
public ResponseEntity<?> handleMaxUploadSizeExceededException(MaxUploadSizeExceededException e) {
return ResponseEntity.status(HttpStatus.PAYLOAD_TOO_LARGE)
.body(Map.of("message", "文件大小超过限制单次上传总大小不能超过500MB"));
}
/**
* 处理参数校验异常
*/
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<?> handleValidationException(MethodArgumentNotValidException e) {
String errorMsg = e.getBindingResult().getFieldErrors().stream()
.map(FieldError::getDefaultMessage)
.collect(Collectors.joining(", "));
return ResponseEntity.status(HttpStatus.BAD_REQUEST)
.body(Map.of("message", errorMsg.isEmpty() ? "参数校验失败" : errorMsg));
}
/**
* 处理非法参数异常
*/
@ExceptionHandler(IllegalArgumentException.class)
public ResponseEntity<?> handleIllegalArgumentException(IllegalArgumentException e) {
return ResponseEntity.status(HttpStatus.BAD_REQUEST)
.body(Map.of("message", e.getMessage() != null ? e.getMessage() : "参数错误"));
}
/**
* 处理所有运行时异常
*/
@ExceptionHandler(RuntimeException.class)
public ResponseEntity<?> handleRuntimeException(RuntimeException e) {
e.printStackTrace();
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
// 业务异常返回 400避免触发前端登录跳转
HttpStatus status = HttpStatus.BAD_REQUEST;
return ResponseEntity.status(status)
.body(Map.of("message", e.getMessage() != null ? e.getMessage() : "服务器内部错误"));
}

View File

@@ -36,6 +36,7 @@ request.interceptors.response.use(
}
const status = error.response?.status
const errorMsg = error.response?.data?.message || error.message || '请求失败'
// 只有 401/403 才清理 token 并跳转登录页
// 但在登录页时不跳转(避免死循环),登录接口的 401 也不跳转
@@ -57,9 +58,20 @@ request.interceptors.response.use(
localStorage.removeItem('storageLimit')
window.location.href = '/login'
return Promise.reject(error)
}
return Promise.reject(error)
// 413 文件过大,返回带消息的错误
if (status === 413) {
const err = new Error(errorMsg)
err.response = error.response
return Promise.reject(err)
}
// 其他错误,返回带消息的错误
const err = new Error(errorMsg)
err.response = error.response
return Promise.reject(err)
}
)

View File

@@ -389,7 +389,8 @@ const handleUpload = async (fileList) => {
loadFiles()
refreshStorage()
} catch (e) {
ElMessage.error('上传失败')
const errorMsg = e.response?.data?.message || e.message || '上传失败'
ElMessage.error(errorMsg)
} finally {
uploading.value = false
}
@@ -401,7 +402,8 @@ const handleCreateFolder = async (name) => {
ElMessage.success('创建成功')
loadFiles()
} catch (e) {
ElMessage.error('创建失败')
const errorMsg = e.response?.data?.message || e.message || '创建失败'
ElMessage.error(errorMsg)
}
}
@@ -445,7 +447,8 @@ const handleConfirmRename = async ({ id, name }) => {
ElMessage.success('重命名成功')
loadFiles()
} catch (e) {
ElMessage.error('重命名失败')
const errorMsg = e.response?.data?.message || e.message || '重命名失败'
ElMessage.error(errorMsg)
}
}
@@ -459,7 +462,8 @@ const handleDownload = async (file) => {
a.click()
URL.revokeObjectURL(url)
} catch (e) {
ElMessage.error('下载失败')
const errorMsg = e.response?.data?.message || e.message || '下载失败'
ElMessage.error(errorMsg)
}
}
@@ -482,7 +486,8 @@ const handleRestore = async (file) => {
ElMessage.success('已还原')
loadFiles()
} catch (e) {
ElMessage.error('还原失败')
const errorMsg = e.response?.data?.message || e.message || '还原失败'
ElMessage.error(errorMsg)
}
}
@@ -494,7 +499,8 @@ const handleDeletePermanently = async (file) => {
loadFiles()
refreshStorage()
} catch (e) {
ElMessage.error('删除失败')
const errorMsg = e.response?.data?.message || e.message || '删除失败'
ElMessage.error(errorMsg)
}
}
@@ -506,7 +512,8 @@ const handleEmptyTrash = async () => {
loadFiles()
refreshStorage()
} catch (e) {
ElMessage.error('操作失败')
const errorMsg = e.response?.data?.message || e.message || '操作失败'
ElMessage.error(errorMsg)
}
}
@@ -524,7 +531,8 @@ const handleConfirmShare = async ({ users, permission }) => {
ElMessage.success('共享成功')
loadFiles()
} catch (e) {
ElMessage.error('共享失败')
const errorMsg = e.response?.data?.message || e.message || '共享失败'
ElMessage.error(errorMsg)
}
}
@@ -535,7 +543,8 @@ const handleCancelShare = async (file) => {
ElMessage.success('已取消共享')
loadFiles()
} catch (e) {
ElMessage.error('操作失败')
const errorMsg = e.response?.data?.message || e.message || '操作失败'
ElMessage.error(errorMsg)
}
}
@@ -608,7 +617,8 @@ const handleBatchMove = async () => {
movableFolders.value = res.data || []
batchMoveVisible.value = true
} catch (e) {
ElMessage.error('获取目录列表失败')
const errorMsg = e.response?.data?.message || e.message || '获取目录列表失败'
ElMessage.error(errorMsg)
}
}
@@ -701,7 +711,8 @@ const handleBatchCancelShare = async () => {
selectedFiles.value = []
loadFiles()
} catch (e) {
ElMessage.error('操作失败')
const errorMsg = e.response?.data?.message || e.message || '操作失败'
ElMessage.error(errorMsg)
}
}
@@ -719,7 +730,8 @@ const handleBatchRestore = async () => {
loadFiles()
refreshStorage()
} catch (e) {
ElMessage.error('操作失败')
const errorMsg = e.response?.data?.message || e.message || '操作失败'
ElMessage.error(errorMsg)
}
}