V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ttxshang
V2EX  ›  MinIO

使用 minio 当作网站后端文件存储的一些疑问

  •  
  •   ttxshang · 2019-03-31 01:39:25 +08:00 · 11772 次点击
    这是一个创建于 2072 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近在考虑使用 minio 替换掉文件系统来存放用户上传的文件(包含压缩包,图片,视频,音频等) 然后,查看官方文档和相关事例代码有些疑问,想请教下。

    1. 如果使用 minio 当存储的话,用户上传文件的流程是不是这样的?用户把文件传到网站服务器上,然后,网站后端再利用 minio 的 sdk 把已经传到服务器的文件传到 minio 的相关服务器上面?

    2. 如果流程不是这样的话,前端直接调用 minio javascript 相关 api 的把文件传到 minio 的服务器上,怎么解决 secretAccessKey 会在前端暴露的问题?

    3. 如果用户上传的是压缩包的话,minio 是否可以实现解压,浏览压缩包相关信息的功能?(如果 minio 原生不支持,按照我的理解就是需要在后端服务器上面,先解压然后再上传 minio 的服务器上,不知道这样的想法对不对?)

    4. minio 支持创建文件夹吗?

    6 条回复    2019-10-11 11:28:06 +08:00
    lynskylate
        1
    lynskylate  
       2019-03-31 01:57:51 +08:00 via Android
    对象存储一般是 1,公有读私有写。
    minio 提供的 sdk 没有压缩选项。
    不支持创建文件夹,在命名时注意区分即可。
    msg7086
        2
    msg7086  
       2019-03-31 09:39:21 +08:00
    minio 我不清楚,但是按理是有一次性 token 直传方案的。
    leopku
        3
    leopku  
       2019-03-31 10:14:20 +08:00
    minio 支持创建文件夹,不过文件夹创建需要的权限较高,不建议直接前端 JS 调用
    合理的方法还是在服务端包一下
    vZexc0m
        4
    vZexc0m  
       2019-03-31 22:20:49 +08:00 via Android
    1.可以由后端做文件上传中转。
    2.可以由后端生成有时效的前端直传 minio 的连接。
    3.不支持压缩。
    4.可以创建文件夹。
    THESDZ
        5
    THESDZ  
       2019-10-11 11:09:26 +08:00
    https://sandyghai.github.io/AWS-S3-Multipart-Upload-Using-Presigned-Url/
    可以生成预签名,分片上传时,每一个分片都可以生成预签名
    实际上每个地址都可以生成预签名
    ```
    Aws4PresignerParams params = Aws4PresignerParams.builder()
    // .expirationTime(storageTemplate.processExpires(expires))
    .awsCredentials(storageTemplate.getCredentials())
    .signingName("s3")
    .expirationTime(Instant.now().plusSeconds(storageTemplate.getExpiresOrDefault(expires)))
    .signingRegion(Region.of(storageTemplate.processRegion(region)))
    .build();
    SdkHttpFullRequest request = SdkHttpFullRequest.builder()
    .encodedPath(storageTemplate.processPath(bucketName, key) + "?uploadId=" + uploadId + "&partNumber=" + partNumber)
    .host(storageTemplate.getHost())
    .method(SdkHttpMethod.PUT)
    .protocol(storageTemplate.getProtocol())
    .build();
    return AwsS3V4Signer.create().presign(request, params).getUri().toString();
    ```
    THESDZ
        6
    THESDZ  
       2019-10-11 11:28:06 +08:00
    5 楼的代码有点问题,参数不能拼接在 path 后面,而是
    appendRawQueryParameter("name","value")
    下面具体代码
    使用的 sdk 是

    ```
    <dependency>
    <groupId>software.amazon.awssdk</groupId>
    <artifactId>s3</artifactId>
    </dependency>

    <dependencyManagement>
    <dependencies>
    <dependency>
    <groupId>software.amazon.awssdk</groupId>
    <artifactId>bom</artifactId>
    <version>2.9.9</version>
    <type>pom</type>
    <scope>import</scope>
    </dependency>
    </dependencies>
    </dependencyManagement>

    ```
    ###############


    Aws4PresignerParams params = Aws4PresignerParams.builder()
    // .expirationTime(storageTemplate.processExpires(expires))
    .awsCredentials(storageTemplate.getCredentials())
    .signingName("s3")
    .expirationTime(Instant.now().plusSeconds(storageTemplate.getExpiresOrDefault(expires)))
    .signingRegion(Region.of(storageTemplate.processRegion(region)))
    .build();
    SdkHttpFullRequest request = SdkHttpFullRequest.builder()
    .encodedPath(storageTemplate.processPath(bucketName, key))
    .host(storageTemplate.getHost())
    .appendRawQueryParameter("uploadId", uploadId)
    .appendRawQueryParameter("partNumber", String.valueOf(partNumber))
    .method(SdkHttpMethod.PUT)
    .protocol(storageTemplate.getProtocol())
    .build();
    return AwsS3V4Signer.create().presign(request, params).getUri().toString();
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2578 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 10:14 · PVG 18:14 · LAX 02:14 · JFK 05:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.