# 文件模块 API 文档索引 > **唯一真源文档** > > 本文档是文件模块 API 的唯一真源文档,包含所有文件存储和文件信息管理接口的完整说明。 ## 📋 文档信息 - **文档版本**: v1.0.0 - **创建日期**: 2026-01-18 - **最后更新**: 2026-01-18 - **维护者**: Datai Team - **文档路径**: `docs/api-docs/file/index.md` ## 🎯 概述 文件模块提供统一的文件存储服务,支持多种存储类型(local、minio、aliyun-oss),包括文件上传、下载、预览、分片上传等功能。同时提供文件信息管理功能,支持文件信息的查询、导出、新增、修改、删除等操作。 ## 📚 控制器导航 ### 1. FileController **文档**: [FileController/](./FileController/) **用途**: 提供统一的文件存储服务接口 **功能特点**: - 支持多种存储类型(local、minio、aliyun-oss) - 提供统一的文件上传、下载、预览接口 - 支持分片上传,适用于大文件 - 部分接口支持匿名访问 **接口列表**: - [0001-client-list.md](./FileController/0001-client-list.md) - 获取所有可用存储渠道及其client列表 - [0002-upload.md](./FileController/0002-upload.md) - 统一上传接口 - [0003-download.md](./FileController/0003-download.md) - 统一下载接口 - [0004-preview.md](./FileController/0004-preview.md) - 统一预览接口(支持匿名访问) - [0005-resource.md](./FileController/0005-resource.md) - 本地资源通用下载(支持匿名访问) - [0006-init-upload.md](./FileController/0006-init-upload.md) - 初始化分片上传 - [0007-upload-chunk.md](./FileController/0007-upload-chunk.md) - 上传文件分片 - [0008-complete-upload.md](./FileController/0008-complete-upload.md) - 完成分片上传并合并文件 **使用场景**: - 文件上传和下载 - 文件预览(图片、文档等) - 大文件分片上传 - 本地资源访问 - 多存储类型支持 ### 2. SysFileInfoController **文档**: [SysFileInfoController/](./SysFileInfoController/) **用途**: 提供文件信息的管理接口 **功能特点**: - 支持文件信息的查询、导出、新增、修改、删除 - 支持分页查询和条件过滤 - 支持批量删除 - 所有接口都需要认证和权限控制 **接口列表**: - [0001-list.md](./SysFileInfoController/0001-list.md) - 查询文件列表 - [0002-export.md](./SysFileInfoController/0002-export.md) - 导出文件列表 - [0003-get-info.md](./SysFileInfoController/0003-get-info.md) - 获取文件详细信息 - [0004-add.md](./SysFileInfoController/0004-add.md) - 新增文件 - [0005-edit.md](./SysFileInfoController/0005-edit.md) - 修改文件 - [0006-remove.md](./SysFileInfoController/0006-remove.md) - 删除文件 **使用场景**: - 文件信息查询和管理 - 文件列表导出 - 文件信息维护 - 批量文件操作 ## 🔧 快速开始 ### 环境要求 - Java 8 或更高版本 - Spring Boot 2.x 或更高版本 - 支持的存储类型: - local: 本地文件系统 - minio: MinIO 对象存储 - aliyun-oss: 阿里云 OSS 对象存储 ### 依赖配置 #### Maven 依赖 ```xml com.datai datai-file-starter 1.0.0 io.minio minio 8.5.7 com.aliyun.oss aliyun-sdk-oss 3.17.4 ``` #### Gradle 依赖 ```groovy dependencies { implementation 'com.datai:datai-file-starter:1.0.0' implementation 'io.minio:minio:8.5.7' implementation 'com.aliyun.oss:aliyun-sdk-oss:3.17.4' } ``` ### 配置示例 #### application.yml ```yaml # 文件存储配置 file: # 默认存储类型 default-storage-type: local # 本地存储配置 local: enabled: true base-path: /data/files # MinIO 配置 minio: enabled: true endpoint: http://localhost:9000 access-key: minioadmin secret-key: minioadmin bucket-name: files # 阿里云 OSS 配置 aliyun-oss: enabled: false endpoint: oss-cn-hangzhou.aliyuncs.com access-key-id: your-access-key-id access-key-secret: your-access-key-secret bucket-name: your-bucket-name ``` ## 📖 使用指南 ### 1. 文件上传 #### 简单上传 ```java import org.springframework.web.multipart.MultipartFile; import org.springframework.beans.factory.annotation.Autowired; import com.datai.file.controller.FileController; @RestController public class MyController { @Autowired private FileController fileController; @PostMapping("/upload") public String uploadFile(@RequestParam("file") MultipartFile file) { // 使用默认存储类型上传 String url = fileController.uploadUnified(file); return url; } } ``` #### 指定存储类型上传 ```java @PostMapping("/upload") public String uploadFile( @RequestParam("file") MultipartFile file, @RequestParam("storageType") String storageType, @RequestParam("bucketName") String bucketName ) { // 指定存储类型和存储桶上传 String url = fileController.uploadUnified(file, storageType, bucketName); return url; } ``` ### 2. 文件下载 ```java @GetMapping("/download") public void downloadFile( @RequestParam("storageType") String storageType, @RequestParam("bucketName") String bucketName, @RequestParam("objectName") String objectName, HttpServletResponse response ) { // 下载文件 fileController.downloadUnified(storageType, bucketName, objectName, response); } ``` ### 3. 文件预览 ```java @GetMapping("/preview") public void previewFile( @RequestParam("storageType") String storageType, @RequestParam("bucketName") String bucketName, @RequestParam("objectName") String objectName, HttpServletResponse response ) { // 预览文件 fileController.preview(storageType, bucketName, objectName, response); } ``` ### 4. 分片上传 #### 初始化分片上传 ```java @PostMapping("/init-multipart-upload") public Map initMultipartUpload( @RequestParam("fileName") String fileName, @RequestParam("fileSize") Long fileSize, @RequestParam("chunkSize") Integer chunkSize, @RequestParam("storageType") String storageType, @RequestParam("bucketName") String bucketName ) { // 初始化分片上传 return fileController.initMultipartUpload( fileName, fileSize, chunkSize, storageType, bucketName ); } ``` #### 上传文件分片 ```java @PostMapping("/upload-chunk") public Map uploadChunk( @RequestParam("uploadId") String uploadId, @RequestParam("chunkNumber") Integer chunkNumber, @RequestParam("file") MultipartFile file ) { // 上传文件分片 return fileController.uploadFileChunk(uploadId, chunkNumber, file); } ``` #### 完成分片上传 ```java @PostMapping("/complete-multipart-upload") public Map completeMultipartUpload( @RequestParam("uploadId") String uploadId ) { // 完成分片上传并合并文件 return fileController.completeMultipartUpload(uploadId); } ``` ### 5. 文件信息查询 ```java @Autowired private SysFileInfoController fileInfoController; @GetMapping("/file-list") public PageResult getFileList( @RequestParam(defaultValue = "1") Integer pageNum, @RequestParam(defaultValue = "10") Integer pageSize, @RequestParam(required = false) String fileName, @RequestParam(required = false) String filePath ) { // 查询文件列表 SysFileInfo fileInfo = new SysFileInfo(); fileInfo.setFileName(fileName); fileInfo.setFilePath(filePath); return fileInfoController.list(pageNum, pageSize, fileInfo); } ``` ## ⚠️ 注意事项 ### 1. 存储类型选择 - **local**: 适用于小规模应用,文件存储在本地文件系统 - **minio**: 适用于需要对象存储功能的应用,支持分布式存储 - **aliyun-oss**: 适用于需要云存储的应用,提供高可用性和扩展性 ### 2. 文件大小限制 - 单次上传文件大小限制:100 MB(可配置) - 分片上传支持大文件:最大 10 GB - 分片大小建议:5-10 MB ### 3. 安全性 - 文件上传需要认证(除匿名接口外) - 文件下载和预览需要认证(除匿名接口外) - 文件信息管理需要认证和权限控制 - 支持文件类型白名单和黑名单 ### 4. 性能优化 - 使用分片上传提高大文件上传效率 - 使用 CDN 加速文件访问 - 合理设置缓存策略 - 定期清理过期文件 ### 5. 错误处理 - 文件不存在:返回 404 错误 - 文件上传失败:返回详细错误信息 - 存储空间不足:返回 507 错误 - 权限不足:返回 403 错误 ## 🎓 最佳实践 ### 1. 文件命名规范 ```java // 使用时间戳 + 随机数生成唯一文件名 String fileName = System.currentTimeMillis() + "_" + UUID.randomUUID().toString().substring(0, 8) + ".jpg"; ``` ### 2. 文件路径组织 ```java // 按日期组织文件路径 String filePath = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy/MM/dd")); ``` ### 3. 文件类型验证 ```java // 验证文件类型 String[] allowedTypes = {"image/jpeg", "image/png", "application/pdf"}; if (!Arrays.asList(allowedTypes).contains(file.getContentType())) { throw new IllegalArgumentException("不支持的文件类型"); } ``` ### 4. 文件大小验证 ```java // 验证文件大小 long maxSize = 100 * 1024 * 1024; // 100 MB if (file.getSize() > maxSize) { throw new IllegalArgumentException("文件大小超过限制"); } ``` ### 5. 异常处理 ```java try { String url = fileController.uploadUnified(file); return url; } catch (Exception e) { log.error("文件上传失败", e); throw new RuntimeException("文件上传失败: " + e.getMessage()); } ``` ## 🔗 相关资源 ### 官方文档 - [Spring Boot 文件上传](https://spring.io/guides/gs/uploading-files/) - [MinIO 文档](https://docs.min.io/) - [阿里云 OSS 文档](https://help.aliyun.com/product/31815.html) ### 相关模块 - [datai-scene-file](../../../datai-scenes/datai-scene-file/) - 文件存储模块源代码 - [Authentication.canvas](../../Authentication.canvas) - 项目架构图 ## 📝 更新日志 ### v1.0.0 (2026-01-18) - 初始版本发布 - 包含 FileController 和 SysFileInfoController 的完整 API 文档 - 提供使用示例和最佳实践 - 添加注意事项和错误处理指南 ## 📧 联系方式 如有问题或建议,请联系: - **维护者**: Datai Team - **邮箱**: support@datai.com - **文档路径**: `docs/api-docs/file/index.md` --- **注意**: 本文档是唯一真源文档,所有关于文件模块 API 的使用说明和最佳实践都应以此文档为准。如有任何疑问,请参考本文档或联系维护者。