使用 minio 当作网站后端文件存储的一些疑问 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ttxshang
V2EX    MinIO

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

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

    最近在考虑使用 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     Solana     1122 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 17:45 PVG 01:45 LAX 09:45 JFK 12:45
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86