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

2019-03-31 01:39:25 +08:00
 ttxshang

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

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

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

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

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

11766 次点击
所在节点    MinIO
6 条回复
lynskylate
2019-03-31 01:57:51 +08:00
对象存储一般是 1,公有读私有写。
minio 提供的 sdk 没有压缩选项。
不支持创建文件夹,在命名时注意区分即可。
msg7086
2019-03-31 09:39:21 +08:00
minio 我不清楚,但是按理是有一次性 token 直传方案的。
leopku
2019-03-31 10:14:20 +08:00
minio 支持创建文件夹,不过文件夹创建需要的权限较高,不建议直接前端 JS 调用
合理的方法还是在服务端包一下
vZexc0m
2019-03-31 22:20:49 +08:00
1.可以由后端做文件上传中转。
2.可以由后端生成有时效的前端直传 minio 的连接。
3.不支持压缩。
4.可以创建文件夹。
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
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();

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/550407

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX