第四章:minio的presignedURLs上传文件

第四章:minio的presignedURLs上传文件

2023年6月25日发(作者:)

第四章:minio的presignedURLs上传⽂件章节快捷访问:第⼀章:minio介绍与安装第⼆章:minio单机版,使⽤客户端备份⽂件第三章:minio的javaAPI第四章:minio的presigned URLs上传⽂件--------------------------------------------------

当我们通过java的API上传⽂件的时候就会发现,我们把java的API封装了⼀下,提供了⼀个接⼝给其他应⽤调⽤,那么整个的上传流程就变成了“应⽤客户端”-->“JavaAPI端”-->“minio服务端”。中间通过JavaAPI转了⼀次。⽐如我们的“应⽤客户端”是web浏览器的时候,能不能直接从浏览器上传到“minio服务端”呢?答案是可以的,minio有提供JSSDK,我们可以通过JSAPI直接上传到“minio服务端”。JSSDK参考官⽹的⽂档:var Minio = require('minio')// Instantiate the minio client with the endpoint// and access keys as shown minioClient = new ({ endPoint: '', port: 9000, useSSL: true, accessKey: 'Q3AM3UQ867SPQQA43P2F', secretKey: 'zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG'});// File that needs to be file = '/tmp/'// Make a bucket called cket('europetrip', 'us-east-1', function(err) { if (err) return (err) ('Bucket created successfully in "us-east-1".') var metaData = { 'Content-Type': 'application/octet-stream', 'X-Amz-Meta-Testing': 1234, 'example': 5678 } // Using fPutObject API upload your file to the bucket europetrip. ject('europetrip', '', file, metaData, function(err, etag) { if (err) return (err) ('File uploaded successfully.') });});根据官⽹的⽂档,我们可以看到,从js上传⽂件需要将我们的accessKey跟secretKey暴露出去。这样的话,别⼈拿到我们的key岂不是可以为所欲为了!这样是很危险的,所以我们不能这样做。除⾮你是⽤这段脚本来写服务,把他当作服务端。但是这样的话,岂不是⼜是通过“应⽤客户端”-->“api端”-->“minio服务端”这样的路径来进⾏上传了。presigned URLsminio并没有像商⽤的七⽜云存储那样,可以通过临时的token来上传⽂件。但是,这个但是很重要啊,他提供了使⽤pre-signed URLs通过浏览器上传⽂件。那么这个pre-signed URLs是啥⼦?pre-signed URLs简单来说就是预处理签名的⼀个URL。就是url中包含了签名信息,但是是经过加密的。⽽且还有时效性的。这样⼀来就跟七⽜云的临时token有异曲同⼯之处了。既保证了⽤最短的途径能上传⽂件,⼜保证了我们的上传签名信息不会被恶意利⽤。官⽹的⽂档:这⾥官⽹给出的例⼦是的,我们使⽤Java该怎么⽤呢!⾸先在我们之前的MinioTemplate类中,加上⽀持⽅法:/** * 获得上传的URL * @param bucketName * @param objectName * @param expires * @return * @throws IOException * @throws InvalidKeyException * @throws NoSuchAlgorithmException * @throws InsufficientDataException * @throws InvalidExpiresRangeException * @throws InternalException * @throws NoResponseException * @throws InvalidBucketNameException * @throws XmlPullParserException * @throws ErrorResponseException */ if(expires == null){ // 7天 return nedPutObject(bucketName,objectName); } return nedPutObject(bucketName,objectName,expires);}public String presignedPutObject(String bucketName, String objectName, Integer expires) throws IOException, InvalidKeyException, NoSuchAlgorithmException, I然后在我们之前的控制器中加上⽅法:/** * 获得上传的URL * @param bucketName ⽂件桶名称 * @param objectName ⽂件对象名称:(pdf/2019/0512/) */@ApiOperation(value = "获得上传的URL", response = )@GetMapping("/uploadUrl")public ActionResult uploadUrl( @ApiParam(name = "bucketName",value = "⽂件桶名称") String bucketName, @ApiParam(name = "objectName",value = "⽂件对象名称:(pdf/2019/0512/)") String objectName, @ApiParam(name = "expires", value ="链接有效时间(单位秒)") Integer expires) String url = nedPutObject(bucketName,objectName,expires); return success(url,"获取成功");} throws IOException, XmlPullParserException, NoSuchAlgorithmException, InvalidKeyException, InvalidPortException, ErrorResponseException, NoResponse这样js在上传之前先调⽤我们的uploadUrl⽅法得到我们的上传URL在之前我们配置java的api链接的是51.78服务端,那么我们先来看看⾥⾯有什么⽂件。可以看到,只有⼀张图⽚,下⾯我们调⽤java获取上传URL的⽅法:可以看到我们调⽤⽅法,得到了⼀个带有签名信息的URL,下⾯我将使⽤这个url来进⾏⽂件的上传:需要注意⼀下,这⾥是要发送⼀个PUT请求,还有上传的是binary⼆进制⽂件流。这⾥上传成功后,并没有返回任何信息...我们打开51.78服务来看看⽂件已经成功上传了,在看看我们的51.80备份库。我们看到,也备份成功了。这⼀串路径是因为51.78⽂件服务的存储地址就在这个路径下⾯,所以备份的时候也将这些路径带来了。这⾥需要注意的是 ,我使⽤的是Postman测试⼯具来测试的,如果使⽤前端测试,需要注意跨域的问题,官⽹推荐使⽤的上传js⼯具包是Fetch。我们看看官⽹的例⼦:
No uploads
好了,单机版本基本就结束了,如果后续还有啥要补充的,我会持续更新的。================这⾥还是直接给出VUE的例⼦页⾯

JSimport Vue from "vue";import api from "@/api/";import axios from "axios";//权限管理模块export default { namespaced: true, state: { iptstate: false, //表单是否可以编辑 watch: false, //表单是否为查看状态 sysidstate: false, //表单是否为编辑状态 titleName: "新增⽂件对象", filesForm: { bucketName: "", perfixName: "", expires: "", dateFile: 1, upfile: "" } }, actions: { // 添加⽂件对象 addSave: async function({ dispatch,commit, state },progressEvent) { let params = orm; const file = elector("input[type=file]").files[0]; (file) const options = {}; = 'PUT'; adProgress = progressEvent; = file; // 这⾥("files/getUploadUrl")从后台获得了真正上传的签名URL return await t("get", ("files/getUploadUrl"), {bucketName: Name, objectName: }).then(resUrl => { () = ; // 设置URL后,上传到minio return axios(options).then((res) => { ("", res); return {success:true}; }).catch(thrown => { return {success:false}; }); }); } }, mutations: { // 初始化数据 CHANGE_BASIC_ID(state, data) { Name = ""; Name = ""; s = ""; le = 1; = ""; } } //getters: {}};效果好了,这⾥VUE的上传就算完成了。

发布者:admin,转转请注明出处:http://www.yc00.com/news/1687678064a30807.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信