MinIO - 服务端签名直传(前端 + 后端 + 效果演示)
发布日期:2025-04-14 03:06:22 浏览次数:9 分类:精选文章

本文共 2611 字,大约阅读时间需要 8 分钟。

服务端签名直传:实现OSS文件上传的最佳方式

传统的文件上传方式

在传统的实现中,有两种主要方式可以将图片上传到OSS(Object Storage Service):

  • 前端请求 -> 后端服务器 -> OSS

    优点:安全性较高,OSS账号信息不会被用户看到。
    缺点:可能给后端服务器带来较大的负载压力。

  • 直接写在前端JS代码中

    优点:效率高,减少了对后端服务器的依赖。
    缺点:存在安全隐患,用户可以直接看到OSS账号密码信息。

  • 服务端签名直传:解决问题

    因此,最好的方式就是采用服务端签名直传

    • 用户直接向服务器请求获取上传签名(由服务器生成的加密签名,通常带有过期时间)。
    • 服务器返回签名后,用户可以拿着签名和要上传的文件,通过表单直接上传到OSS中。

    这样既不会给服务器带来上传文件的压力,也确保了OSS账号密码信息的安全性。

    后端实现

    1. 配置文件

    在Spring Boot项目中,我们需要先配置MinIO客户端。以下是配置文件的内容:

    minio.access-key=rootminio.secret-key=rootrootminio.endpoint=http://100.105.180.32:9001minio.bucket=dir1

    2. Bean配置

    在Spring配置类中,定义MinIO客户端:

    import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import io.minio.MinioClient;import org.springframework.beans.factory.annotation.Value;@Configurationpublic class MinioConfig {    @Value("${minio.access-key}")    private String accessKey;    @Value("${minio.secret-key}")    private String secretKey;    @Value("${minio.endpoint}")    private String endpoint;    @Bean    public MinioClient minioClient() {        return MinioClient.builder()            .endpoint(endpoint)            .credentials(accessKey, secretKey)            .build();    }}

    3. 核心代码

    在API控制器中,实现签名生成和文件上传:

    import org.springframework.beans.factory.annotation.Value;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.RestController;@RestController@RequestMapping("/third/minio")public class MinioApi {    private final MinioClient minioClient;    @Value("${minio.endpoint}")    private String endpoint;    @Value("${minio.bucket}")    private String bucket;    public MinioApi(MinioClient minioClient) {        this.minioClient = minioClient;    }    @RequestMapping(value = "/policy", method = RequestMethod.GET)    public Map
    policy() { String objectNamePrefix = "uploads/"; var expiration = ZonedDateTime.now().plusHours(1); var postPolicy = minioClient.getPresignedPostFormData( new PostPolicy( bucket, expiration ).run { addStartsWithCondition("key", objectNamePrefix) addContentLengthRangeCondition(1, 10485760) } ); postPolicy.result.apply { this["url"] = "$endpoint/$bucket" } return postPolicy.result; }}

    前端实现

    在前端,实现文件上传的逻辑:

        
    MinIO 文件上传

    MinIO 文件上传

    效果演示

  • 选择文件:点击选择按钮,选择需要上传的文件(如mongo.png)。
  • 上传文件:点击“上传”按钮,系统会自动处理文件上传。
  • 查看结果:上传成功后,可以在MinIO控制台查看文件是否已经成功长传。
  • 通过以上实现,您可以轻松实现安全、高效的文件上传功能,同时减少服务器负载。

    上一篇:MiniOS 3.3.4 发布,新功能有这些!
    下一篇:MinIO - 从 环境搭建 -> SpringBoot实战 -> 演示,掌握 Bucket 和 Object 操作

    发表评论

    最新留言

    能坚持,总会有不一样的收获!
    [***.219.124.196]2025年05月13日 07时04分31秒