最近在考虑使用 minio 替换掉文件系统来存放用户上传的文件(包含压缩包,图片,视频,音频等) 然后,查看官方文档和相关事例代码有些疑问,想请教下。
如果使用 minio 当存储的话,用户上传文件的流程是不是这样的?用户把文件传到网站服务器上,然后,网站后端再利用 minio 的 sdk 把已经传到服务器的文件传到 minio 的相关服务器上面?
如果流程不是这样的话,前端直接调用 minio javascript 相关 api 的把文件传到 minio 的服务器上,怎么解决 secretAccessKey 会在前端暴露的问题?
如果用户上传的是压缩包的话,minio 是否可以实现解压,浏览压缩包相关信息的功能?(如果 minio 原生不支持,按照我的理解就是需要在后端服务器上面,先解压然后再上传 minio 的服务器上,不知道这样的想法对不对?)
minio 支持创建文件夹吗?
1
lynskylate 2019-03-31 01:57:51 +08:00 via Android
对象存储一般是 1,公有读私有写。
minio 提供的 sdk 没有压缩选项。 不支持创建文件夹,在命名时注意区分即可。 |
2
msg7086 2019-03-31 09:39:21 +08:00
minio 我不清楚,但是按理是有一次性 token 直传方案的。
|
3
leopku 2019-03-31 10:14:20 +08:00
minio 支持创建文件夹,不过文件夹创建需要的权限较高,不建议直接前端 JS 调用
合理的方法还是在服务端包一下 |
4
vZexc0m 2019-03-31 22:20:49 +08:00 via Android
1.可以由后端做文件上传中转。
2.可以由后端生成有时效的前端直传 minio 的连接。 3.不支持压缩。 4.可以创建文件夹。 |
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(); ``` |
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(); |