datai/docs/archive/api-docs/file/index.md

11 KiB
Raw Permalink Blame History

文件模块 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/

用途: 提供统一的文件存储服务接口

功能特点:

  • 支持多种存储类型local、minio、aliyun-oss
  • 提供统一的文件上传、下载、预览接口
  • 支持分片上传,适用于大文件
  • 部分接口支持匿名访问

接口列表:

使用场景:

  • 文件上传和下载
  • 文件预览(图片、文档等)
  • 大文件分片上传
  • 本地资源访问
  • 多存储类型支持

2. SysFileInfoController

文档: SysFileInfoController/

用途: 提供文件信息的管理接口

功能特点:

  • 支持文件信息的查询、导出、新增、修改、删除
  • 支持分页查询和条件过滤
  • 支持批量删除
  • 所有接口都需要认证和权限控制

接口列表:

使用场景:

  • 文件信息查询和管理
  • 文件列表导出
  • 文件信息维护
  • 批量文件操作

🔧 快速开始

环境要求

  • Java 8 或更高版本
  • Spring Boot 2.x 或更高版本
  • 支持的存储类型:
    • local: 本地文件系统
    • minio: MinIO 对象存储
    • aliyun-oss: 阿里云 OSS 对象存储

依赖配置

Maven 依赖

<dependencies>
    <!-- 文件存储模块 -->
    <dependency>
        <groupId>com.datai</groupId>
        <artifactId>datai-file-starter</artifactId>
        <version>1.0.0</version>
    </dependency>
    
    <!-- MinIO 客户端(可选) -->
    <dependency>
        <groupId>io.minio</groupId>
        <artifactId>minio</artifactId>
        <version>8.5.7</version>
    </dependency>
    
    <!-- 阿里云 OSS 客户端(可选) -->
    <dependency>
        <groupId>com.aliyun.oss</groupId>
        <artifactId>aliyun-sdk-oss</artifactId>
        <version>3.17.4</version>
    </dependency>
</dependencies>

Gradle 依赖

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

# 文件存储配置
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. 文件上传

简单上传

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;
    }
}

指定存储类型上传

@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. 文件下载

@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. 文件预览

@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. 分片上传

初始化分片上传

@PostMapping("/init-multipart-upload")
public Map<String, Object> 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
    );
}

上传文件分片

@PostMapping("/upload-chunk")
public Map<String, Object> uploadChunk(
    @RequestParam("uploadId") String uploadId,
    @RequestParam("chunkNumber") Integer chunkNumber,
    @RequestParam("file") MultipartFile file
) {
    // 上传文件分片
    return fileController.uploadFileChunk(uploadId, chunkNumber, file);
}

完成分片上传

@PostMapping("/complete-multipart-upload")
public Map<String, Object> completeMultipartUpload(
    @RequestParam("uploadId") String uploadId
) {
    // 完成分片上传并合并文件
    return fileController.completeMultipartUpload(uploadId);
}

5. 文件信息查询

@Autowired
private SysFileInfoController fileInfoController;

@GetMapping("/file-list")
public PageResult<SysFileInfo> 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. 文件命名规范

// 使用时间戳 + 随机数生成唯一文件名
String fileName = System.currentTimeMillis() + "_" + 
                  UUID.randomUUID().toString().substring(0, 8) + 
                  ".jpg";

2. 文件路径组织

// 按日期组织文件路径
String filePath = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy/MM/dd"));

3. 文件类型验证

// 验证文件类型
String[] allowedTypes = {"image/jpeg", "image/png", "application/pdf"};
if (!Arrays.asList(allowedTypes).contains(file.getContentType())) {
    throw new IllegalArgumentException("不支持的文件类型");
}

4. 文件大小验证

// 验证文件大小
long maxSize = 100 * 1024 * 1024; // 100 MB
if (file.getSize() > maxSize) {
    throw new IllegalArgumentException("文件大小超过限制");
}

5. 异常处理

try {
    String url = fileController.uploadUnified(file);
    return url;
} catch (Exception e) {
    log.error("文件上传失败", e);
    throw new RuntimeException("文件上传失败: " + e.getMessage());
}

🔗 相关资源

官方文档

相关模块

📝 更新日志

v1.0.0 (2026-01-18)

  • 初始版本发布
  • 包含 FileController 和 SysFileInfoController 的完整 API 文档
  • 提供使用示例和最佳实践
  • 添加注意事项和错误处理指南

📧 联系方式

如有问题或建议,请联系:

  • 维护者: Datai Team
  • 邮箱: support@datai.com
  • 文档路径: docs/api-docs/file/index.md

注意: 本文档是唯一真源文档,所有关于文件模块 API 的使用说明和最佳实践都应以此文档为准。如有任何疑问,请参考本文档或联系维护者。