diff --git a/README.md b/README.md index 4b7ca4d..8c726e5 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,7 @@ ## 演示 ![ev](images/ev_1.gif) + ## 项目简介 本项目是一个基于前后端分离架构的文件上传系统,支持多种存储方式,包括本地存储、阿里云 OSS 和 MinIO。用户可以通过直观的界面上传文件并管理已上传的文件。 @@ -24,26 +25,47 @@ - MinIO(分布式对象存储) - 敬请期待。。。 +### 功能特性 -## 开发者的话 +- 断点续传 +- 文件分片 +- 文件校验 +- 文件秒传 +- 多文件上传 +- 支持多种存储方式切换 +- 文件预览(图片、视频、PDF) +- 存储配置连接测试 -尊敬的读者: -首先,请允许我向您致以诚挚的问候,并对项目中可能存在的不足表达由衷的歉意。作为一名主要专注于后端开发的工程师,我在前端设计与用户界面的呈现上仍处于学习与成长的阶段。因此,您在体验本项目时,可能会注意到页面布局不够精致、样式设计略显简朴、交互体验有待流畅,或是响应式设计尚未完美适配等问题。这些瑕疵,或许无法完全展现我对这个项目的完整构想,也可能在某种程度上影响您的使用体验。 -我深知,一个优雅、直观的用户界面是产品体验不可或缺的一部分。为此,我正全力以赴提升前端开发技能,并积极探索更优的解决方案,以弥补现阶段的不足,逐步提升页面的美观度与实用性。 +## 预览 +### 首页 +![首页](images/image-1.png) -您的每一条意见与建议,对我来说都是弥足珍贵的财富。如果您在使用过程中有任何想法或改进建议,欢迎随时与我联系(邮箱:chenzhihua0123@gmail.com 或 GitHub Issues)。我承诺,将认真倾听您的需求,并尽我所能优化这个项目,力求为您带来一个更加美观、友好且高效的文件上传工具。 +### 已上传文件 页面 +![已上传文件](images/image-2.png) -感谢您的耐心与包容。正是因为有您的支持,我才有动力不断前行。我坚信,随着时间的推移,我的技能会逐步精进,项目的品质也将日益提升。希望我们能一起见证这份作品从青涩走向成熟的旅程,每一个小小的进步都将成为我们共同的成就。 +### 上传设置 +![上传设置](images/image.png) -再次感谢您的理解与陪伴,期待与您携手共创更美好的体验! +### 存储配置 +![存储配置](images/image-20250327234514185.png) -此致, +### 文件预览 + +- 图片 + + ![图片预览](images/image-20250327234627306.png) + +- 视频 + + ![视频预览](images/image-20250327234757085.png) + +- PDF + + ![PDF预览](images/image-20250327234921756.png) -czh-dev -2025年3月 ## 快速开始 @@ -223,30 +245,6 @@ logging: cn.czh.mapper: debug ``` -## 功能特性 - -- 断点续传 -- 文件分片 -- 文件校验 -- 文件秒传 -- 多文件上传 -- 支持多种存储方式切换 -- 文件预览和管理 -- 分页加载已上传文件 - -## 预览 -### 首页 -![alt text](images/image-1.png) - -### 已上传文件 页面 -![alt text](images/image-2.png) - -### 上传设置 -![alt text](images/image.png) - -### 存储配置 -![alt text](images/image-3.png) - ## 贡献 diff --git a/images/image-20250327234514185.png b/images/image-20250327234514185.png new file mode 100644 index 0000000..0d7cc3f Binary files /dev/null and b/images/image-20250327234514185.png differ diff --git a/images/image-20250327234627306.png b/images/image-20250327234627306.png new file mode 100644 index 0000000..f1bcd5e Binary files /dev/null and b/images/image-20250327234627306.png differ diff --git a/images/image-20250327234757085.png b/images/image-20250327234757085.png new file mode 100644 index 0000000..96bf8b8 Binary files /dev/null and b/images/image-20250327234757085.png differ diff --git a/images/image-20250327234921756.png b/images/image-20250327234921756.png new file mode 100644 index 0000000..6e100c0 Binary files /dev/null and b/images/image-20250327234921756.png differ diff --git a/upload-file-backend/src/main/java/cn/czh/advice/GlobalExceptionHandler.java b/upload-file-backend/src/main/java/cn/czh/advice/GlobalExceptionHandler.java index db045b5..7b1f843 100644 --- a/upload-file-backend/src/main/java/cn/czh/advice/GlobalExceptionHandler.java +++ b/upload-file-backend/src/main/java/cn/czh/advice/GlobalExceptionHandler.java @@ -2,18 +2,15 @@ package cn.czh.advice; import cn.czh.base.BusinessException; import cn.czh.base.Result; -import org.springframework.http.HttpStatus; import org.springframework.validation.FieldError; import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ExceptionHandler; -import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestControllerAdvice; @RestControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(MethodArgumentNotValidException.class) - @ResponseStatus(HttpStatus.BAD_REQUEST) public Result handleValidationException(MethodArgumentNotValidException ex) { FieldError fieldError = ex.getBindingResult().getFieldErrors().get(0); String errorMessage = fieldError.getDefaultMessage(); @@ -21,7 +18,6 @@ public class GlobalExceptionHandler { } @ExceptionHandler(BusinessException.class) - @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) public Result handleBusinessException(BusinessException e) { return Result.error(500, e.getMessage()); } diff --git a/upload-file-backend/src/main/java/cn/czh/controller/ConfigController.java b/upload-file-backend/src/main/java/cn/czh/controller/ConfigController.java index d66bcd5..e3391e2 100644 --- a/upload-file-backend/src/main/java/cn/czh/controller/ConfigController.java +++ b/upload-file-backend/src/main/java/cn/czh/controller/ConfigController.java @@ -26,4 +26,9 @@ public class ConfigController { return Result.success(); } + @PostMapping("/test") + public Result testConfig(@Valid @RequestBody StorageConfig config) { + storageConfigService.testStorageConfig(config); + return Result.success(); + } } diff --git a/upload-file-backend/src/main/java/cn/czh/service/IStorageConfigService.java b/upload-file-backend/src/main/java/cn/czh/service/IStorageConfigService.java index 37fad05..1077e57 100644 --- a/upload-file-backend/src/main/java/cn/czh/service/IStorageConfigService.java +++ b/upload-file-backend/src/main/java/cn/czh/service/IStorageConfigService.java @@ -14,4 +14,9 @@ public interface IStorageConfigService { */ void updateStorageConfig(StorageConfig config); + /** + * 测试存储配置 + */ + void testStorageConfig(StorageConfig config); + } diff --git a/upload-file-backend/src/main/java/cn/czh/service/impl/StorageConfigServiceImpl.java b/upload-file-backend/src/main/java/cn/czh/service/impl/StorageConfigServiceImpl.java index eb90fdc..49deb2e 100644 --- a/upload-file-backend/src/main/java/cn/czh/service/impl/StorageConfigServiceImpl.java +++ b/upload-file-backend/src/main/java/cn/czh/service/impl/StorageConfigServiceImpl.java @@ -4,18 +4,26 @@ import cn.czh.base.BusinessException; import cn.czh.context.StorageConfigUpdateEvent; import cn.czh.entity.StorageConfig; import cn.czh.mapper.StorageConfigMapper; -import cn.czh.mapper.UploadFileMapper; import cn.czh.service.IStorageConfigService; import cn.hutool.core.util.StrUtil; +import com.aliyun.oss.OSS; +import com.aliyun.oss.OSSClientBuilder; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import io.minio.BucketExistsArgs; +import io.minio.MinioClient; +import lombok.extern.slf4j.Slf4j; import org.springframework.context.ApplicationEventPublisher; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; - +@Slf4j @Service public class StorageConfigServiceImpl extends ServiceImpl implements IStorageConfigService { @@ -45,4 +53,87 @@ public class StorageConfigServiceImpl extends ServiceImpl
- - + + +