博客
关于我
MinIO - 服务端签名直传(前端 + 后端 + 效果演示)
阅读量:794 次
发布时间:2023-02-09

本文共 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控制台查看文件是否已经成功长传。
  • 通过以上实现,您可以轻松实现安全、高效的文件上传功能,同时减少服务器负载。

    转载地址:http://kkffk.baihongyu.com/

    你可能感兴趣的文章
    map函数
    查看>>
    map反转key value
    查看>>
    map和bean的相互转换
    查看>>
    map和filter使用方法与区别
    查看>>
    Map如何获取所有value的值
    查看>>
    Map存入的数据丢失类型任意
    查看>>
    Map排序
    查看>>
    Map的深浅拷贝的探究
    查看>>
    Map的遍历方式
    查看>>
    map遍历测试结果
    查看>>
    Map集合
    查看>>
    Map集合循环遍历的几种方式
    查看>>
    Map(关联式容器)
    查看>>
    mariadb multi-source replication(mariadb多主复制)
    查看>>
    Mariadb 分表
    查看>>
    MariaDB密码重置
    查看>>
    MariaDB的简单使用
    查看>>
    Mariadb第一章:介绍及安装--小白博客
    查看>>
    Mark Mind:下一代思维导图编辑器
    查看>>
    markdown
    查看>>