OSS对象存储的简单实现

火影  金牌会员 | 2024-8-15 22:08:07 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 649|帖子 649|积分 1947

条件准备好阿里云对象存储的账号->创建一个bucket(设置好访问权限)->创建用于上传文件的子账号得到accessKey和secretKey以及endpoint->sdk例子java简单上传的例子测试
  

  • 引入alicloud-oss对象纯存储相关的依赖
  

  • 在application.yml中配置accessKey和secretKey即可
  

  • 利用OssClient对象调用方法上传即可
  1. import com.aliyun.oss.ClientException;
  2. import com.aliyun.oss.OSS;
  3. import com.aliyun.oss.OSSClientBuilder;
  4. import com.aliyun.oss.OSSException;
  5. import com.aliyun.oss.model.PutObjectRequest;
  6. import com.aliyun.oss.model.PutObjectResult;
  7. import java.io.FileInputStream;
  8. import java.io.InputStream;
  9. public class Demo {
  10.     public static void main(String[] args) throws Exception {
  11.         //accessKey和secretKey以及endpoint在配置文件中指定的话这里就不用重复指定
  12.         // Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
  13.         String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
  14.         // 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
  15.         String accessKeyId = "yourAccessKeyId";
  16.         String accessKeySecret = "yourAccessKeySecret";
  17.         // 填写Bucket名称,例如examplebucket。
  18.         String bucketName = "examplebucket";
  19.         // 填写Object完整路径,完整路径中不能包含Bucket名称,例如exampledir/exampleobject.txt。
  20.         String objectName = "exampledir/exampleobject.txt";
  21.         // 填写本地文件的完整路径,例如D:\\localpath\\examplefile.txt。
  22.         // 如果未指定本地路径,则默认从示例程序所属项目对应本地路径中上传文件流。
  23.         String filePath= "D:\\localpath\\examplefile.txt";
  24.         // 创建OSSClient实例。
  25.         OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
  26.         try {
  27.             InputStream inputStream = new FileInputStream(filePath);
  28.             // 创建PutObjectRequest对象。
  29.             PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, inputStream);
  30.             // 设置该属性可以返回response。如果不设置,则返回的response为空。
  31.             putObjectRequest.setProcess("true");
  32.             // 创建PutObject请求。
  33.             PutObjectResult result = ossClient.putObject(putObjectRequest);
  34.             // 如果上传成功,则返回200。
  35.             System.out.println(result.getResponse().getStatusCode());
  36.         } catch (OSSException oe) {
  37.             System.out.println("Caught an OSSException, which means your request made it to OSS, "
  38.                     + "but was rejected with an error response for some reason.");
  39.             System.out.println("Error Message:" + oe.getErrorMessage());
  40.             System.out.println("Error Code:" + oe.getErrorCode());
  41.             System.out.println("Request ID:" + oe.getRequestId());
  42.             System.out.println("Host ID:" + oe.getHostId());
  43.         } catch (ClientException ce) {
  44.             System.out.println("Caught an ClientException, which means the client encountered "
  45.                     + "a serious internal problem while trying to communicate with OSS, "
  46.                     + "such as not being able to access the network.");
  47.             System.out.println("Error Message:" + ce.getMessage());
  48.         } finally {
  49.             if (ossClient != null) {
  50.                 ossClient.shutdown();
  51.             }
  52.         }
  53.     }
  54. }
复制代码
一,项目结合实例
  先发送请求获得policy 在将对象发送阿里云对象存储服务器 减轻后端压力
  建立一个oss服务器
  将oss相关配置写在配置文件中
  1. spring:
  2.   cloud:
  3.     nacos:
  4.       discovery:
  5.         server-addr: 127.0.0.1:8848
  6.     application:
  7.       name: gulimall-third-party
  8.     alicloud:
  9.       access-key: LTAI5t6G5JAZ9RB*********** # 修改为自己的
  10.       secret-key: QhhibxJFoXR9qUs*********** # 修改为自己的
  11.       oss:
  12.         endpoint: oss-cn-************* # 修改为自己的
  13.         bucket: test # 修改为自己的
  14. server:
  15.   port: 30000
复制代码
编写controller前端请求这个controller获得policy
  1. package com.wcw.gulimall.third.party.controller;
  2. import com.aliyun.oss.OSS;
  3. import com.aliyun.oss.common.utils.BinaryUtil;
  4. import com.aliyun.oss.model.MatchMode;
  5. import com.aliyun.oss.model.PolicyConditions;
  6. import com.wcw.gulimall.third.party.utils.R;
  7. import org.springframework.beans.factory.annotation.Autowired;
  8. import org.springframework.beans.factory.annotation.Value;
  9. import org.springframework.web.bind.annotation.RequestMapping;
  10. import org.springframework.web.bind.annotation.RestController;
  11. import java.text.SimpleDateFormat;
  12. import java.util.Date;
  13. import java.util.LinkedHashMap;
  14. import java.util.Map;
  15. /**
  16. * @ClassName com.wcw.gulimall.third.party.controller.OssController
  17. * @Description:
  18. * @Author wcw
  19. * @Version V1.0 Created on :2023/3/2 17:25
  20. */
  21. @RestController
  22. public class OssController {
  23.     @Autowired
  24.     private OSS ossClient;
  25.     @Value("${spring.cloud.alicloud.oss.endpoint}")
  26.     private String endPoint;
  27.     @Value("${spring.cloud.alicloud.oss.bucket}")
  28.     private String bucket;
  29.     @Value("${spring.cloud.alicloud.access-key}")
  30.     private String accessId;
  31.     @RequestMapping("/oss/policy")
  32.     public R policy() {
  33.         // 填写Host地址,格式为https://bucketname.endpoint。
  34.         String host = "https://" + bucket + "." + endPoint;
  35.         // 设置上传回调URL,即回调服务器地址,用于处理应用服务器与OSS之间的通信。OSS会在文件上传完成后,把文件上传信息通过此回调URL发送给应用服务器。
  36. //        String callbackUrl = "https://192.168.0.0:8888";
  37.         // 设置上传到OSS文件的前缀,可置空此项。置空后,文件将上传至Bucket的根目录下。
  38.         String format = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
  39.         String dir = format+"/";
  40.         Map<String, String> respMap = new LinkedHashMap<String, String>();
  41.         // 创建ossClient实例。
  42. //        OSS ossClient = new OSSClientBuilder().build(endpoint, accessId, accessKey);
  43.         try {
  44.             long expireTime = 30;
  45.             long expireEndTime = System.currentTimeMillis() + expireTime * 1000;
  46.             Date expiration = new Date(expireEndTime);
  47.             PolicyConditions policyConds = new PolicyConditions();
  48.             policyConds.addConditionItem(PolicyConditions.COND_CONTENT_LENGTH_RANGE, 0, 1048576000);
  49.             policyConds.addConditionItem(MatchMode.StartWith, PolicyConditions.COND_KEY, dir);
  50.             String postPolicy = ossClient.generatePostPolicy(expiration, policyConds);
  51.             byte[] binaryData = postPolicy.getBytes("utf-8");
  52.             String encodedPolicy = BinaryUtil.toBase64String(binaryData);
  53.             String postSignature = ossClient.calculatePostSignature(postPolicy);
  54.             respMap.put("accessId", accessId);
  55.             respMap.put("policy", encodedPolicy);
  56.             respMap.put("signature", postSignature);
  57.             respMap.put("dir", dir);
  58.             respMap.put("host", host);
  59.             respMap.put("expire", String.valueOf(expireEndTime / 1000));
  60.             // respMap.put("expire", formatISO8601Date(expiration));
  61.         } catch (Exception e) {
  62.             // Assert.fail(e.getMessage());
  63.             System.out.println(e.getMessage());
  64.         }
  65.         return R.ok().put("data",respMap);
  66.     }
  67. }
复制代码
返回下面的对象
  1. { policy: '',
  2. signature: '',
  3. key: '',
  4. ossaccessKeyId: '',
  5. dir: '',
  6. host: '',}
复制代码
携带policy按照aliyun oss官方文档发送即可
  1. <template>
  2.   <div>
  3.     <el-upload
  4.       action="http://gulimall-wcw.oss-cn-chengdu.aliyuncs.com"
  5.       :data="dataObj"
  6.       list-type="picture"
  7.       :multiple="false" :show-file-list="showFileList"
  8.       :file-list="fileList"
  9.       :before-upload="beforeUpload"
  10.       :on-remove="handleRemove"
  11.       :on-success="handleUploadSuccess"
  12.       :on-preview="handlePreview">
  13.       <el-button size="small" type="primary">点击上传</el-button>
  14.       <div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过10MB</div>
  15.     </el-upload>
  16.     <el-dialog :visible.sync="dialogVisible">
  17.       <img width="100%" :src="fileList[0].url" alt="">
  18.     </el-dialog>
  19.   </div>
  20. </template>
  21. <script>
  22.    import {policy} from './policy'
  23.    import { getUUID } from '@/utils'
  24.   export default {
  25.     name: 'singleUpload',
  26.     props: {
  27.       value: String
  28.     },
  29.     computed: {
  30.       imageUrl() {
  31.         return this.value;
  32.       },
  33.       imageName() {
  34.         if (this.value != null && this.value !== '') {
  35.           return this.value.substr(this.value.lastIndexOf("/") + 1);
  36.         } else {
  37.           return null;
  38.         }
  39.       },
  40.       fileList() {
  41.         return [{
  42.           name: this.imageName,
  43.           url: this.imageUrl
  44.         }]
  45.       },
  46.       showFileList: {
  47.         get: function () {
  48.           return this.value !== null && this.value !== ''&& this.value!==undefined;
  49.         },
  50.         set: function (newValue) {
  51.         }
  52.       }
  53.     },
  54.     data() {
  55.       return {
  56.         dataObj: {
  57.           policy: '',
  58.           signature: '',
  59.           key: '',
  60.           ossaccessKeyId: '',
  61.           dir: '',
  62.           host: '',
  63.           // callback:'',
  64.         },
  65.         dialogVisible: false
  66.       };
  67.     },
  68.     methods: {
  69.       emitInput(val) {
  70.         this.$emit('input', val)
  71.       },
  72.       handleRemove(file, fileList) {
  73.         this.emitInput('');
  74.       },
  75.       handlePreview(file) {
  76.         this.dialogVisible = true;
  77.       },
  78.       beforeUpload(file) {
  79.         
  80.         let _self = this;
  81.         return new Promise((resolve, reject) => {
  82.           policy().then(response => {
  83.             console.log("response:",response);
  84.             _self.dataObj.policy = response.data.policy;
  85.             _self.dataObj.signature = response.data.signature;
  86.             _self.dataObj.ossaccessKeyId = response.data.accessId;
  87.             _self.dataObj.key = response.data.dir +getUUID()+'_${filename}';
  88.             _self.dataObj.dir = response.data.dir;
  89.             _self.dataObj.host = response.data.host;
  90.             console.log("_self.dataObj:",_self.dataObj);
  91.             resolve(true)
  92.           }).catch(err => {
  93.             reject(false)
  94.           })
  95.         })
  96.       },
  97.       handleUploadSuccess(res, file) {
  98.         console.log("上传成功...")
  99.         this.showFileList = true;
  100.         this.fileList.pop();
  101.         this.fileList.push({name: file.name, url: this.dataObj.host + '/' + this.dataObj.key.replace("${filename}",file.name) });
  102.         this.emitInput(this.fileList[0].url);
  103.       }
  104.     }
  105.   }
  106. </script>
  107. <style>
  108. </style>
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

火影

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表