阿里云oss对象存储的简单使用

Posted 黑胡子大叔的小屋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了阿里云oss对象存储的简单使用相关的知识,希望对你有一定的参考价值。

阿里云OSS对象存储

参考优秀博文

https://www.cnblogs.com/dalaoyang/p/10885424.html

https://www.cnblogs.com/l-y-h/p/12805028.html

上传数据信息到oss服务器有三种方式

oss上传三种方式

  • 数据先上传到自己的服务器,再由自己的服务器转发到oss服务器

    img

  • 前端请求签名,后端服务器完成签名并返回签名,由前端直接上传到oss服务器

img

  • 另外一种就是将key写在前端,完全由前端实现,这种存在安全问题

第一种


工具类

package com.unclebb.zlgl.utils;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.OSSClientBuilder;
import org.springframework.beans.factory.annotation.Value;

import java.io.*;
import java.net.URL;
import java.util.Date;

/**
 * @program: zlgl
 * @description: oss工具类
 * @author: LiuZhiliang
 * @create: 2021-05-26 09:14
 **/
public class OssUtil {

    //这里的配置可以在properties或者yml中进行配置
    @Value("${oss.accessKeyId}")
    private String accessKeyId = "";

    @Value("${oss.accessKeySecret}")
    private String accessKeySecret = "";

    @Value("${oss.bucketName}")
    private String bucketName = "";

    @Value("${oss.endPoint}")
    private  String  endPoint = "";

    //文件直接上传的方式,path 为文件路径,filename 为定义的文件名字
    public void upload(String path, String fileName) {

        OSS ossClient = new OSSClientBuilder().build(endPoint, accessKeyId, accessKeySecret);
        InputStream inputStream = null;
        try {
            inputStream = new FileInputStream(path);
            ossClient.putObject(bucketName, fileName, inputStream);
            // 设置URL过期时间为1小时。
            Date expiration = new Date(System.currentTimeMillis() + 3600 * 1000);
            URL url = ossClient.generatePresignedUrl(bucketName, fileName, expiration);
            System.out.println(url.toString());
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (ossClient != null)
                ossClient.shutdown();
        }
    }
}

第二种


首先返回签名的代码段

public Result getOss() {
        String dir = "user-dir-prefix/"; // 用户上传文件时指定的前缀。
        OSS ossClient = new OSSClientBuilder().build(endPoint, accessKeyId, accessKeySecret);
        InputStream inputStream = null;
        Map<String, String> respMap = new LinkedHashMap<String, String>();

        try {
            // 设置URL过期时间为1小时。
            Date expiration = new Date(System.currentTimeMillis() + 3600 * 1000);
            // PostObject请求最大可支持的文件大小为5 GB,即CONTENT_LENGTH_RANGE为5*1024*1024*1024。
            PolicyConditions policyConds = new PolicyConditions();
            policyConds.addConditionItem(PolicyConditions.COND_CONTENT_LENGTH_RANGE, 0, 1048576000);
            policyConds.addConditionItem(MatchMode.StartWith, PolicyConditions.COND_KEY, dir);

            String postPolicy = ossClient.generatePostPolicy(expiration, policyConds);
            byte[] binaryData = postPolicy.getBytes("utf-8");
            String encodedPolicy = BinaryUtil.toBase64String(binaryData);
            String postSignature = ossClient.calculatePostSignature(postPolicy);

            respMap.put("accessid", accessKeyId);
            respMap.put("policy", encodedPolicy);
            respMap.put("signature", postSignature);
            respMap.put("dir", dir);
            respMap.put("expire", expiration.toString());
            respMap.put("host",host);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (ossClient != null)
                ossClient.shutdown();
        }
        return Result.ok(respMap);
}

在这里插入图片描述

前端上传资源代码段

<template>
  <div class="dashboard-container">
    <input @change="getpolicy($event)" type="file" ref="refName"/>
  </div>
</template>

<script>
import { mapGetters } from 'vuex'
import { getkey,upload } from '@/api/oss'
export default {
  name: 'Dashboard',
  computed: {
    ...mapGetters([
      'name'
    ])
  },
  methods:{
    teststore(){
      console.log(this.$store.getters)
    },
    getpolicy(){
      console.log("进入getplicy")
      getkey().then(res=>{
        console.log(res)
        let files = this.$refs['refName'].files
        console.log(files)
        this.ossUpload(files[0],res.data)
      })
    },
     ossUpload(file, ossToken) {
        const filename = file.name;
        console.log(filename);
        let formData = new FormData();
        //注意formData里append添加的键的大小写
        formData.append('key', ossToken.dir + filename); //存储在oss的文件路径
        formData.append('OSSAccessKeyId', ossToken.accessid); //accessKeyId
        formData.append('policy', ossToken.policy); //policy
        formData.append('Signature', ossToken.signature); //签名
        //如果是base64文件,那么直接把base64字符串转成blob对象进行上传就可以了
        formData.append("file", file);
        upload(ossToken.host,formData).then(res=>{
          console.log(res);
        })
     }

  }
}
</script>

<style lang="scss" scoped>
.dashboard {
  &-container {
    margin: 30px;
  }
  &-text {
    font-size: 30px;
    line-height: 46px;
  }
}
</style>

选择了文件便进行了请求key以及上传
在这里插入图片描述

这里oss须设置跨域
在这里插入图片描述

以上是关于阿里云oss对象存储的简单使用的主要内容,如果未能解决你的问题,请参考以下文章

使用阿里云oss

阿里OSS对象存储使用

小白使用阿里云的oss实现文件云存储

使用axios上传文件到阿里云对象文件存储服务器oss

python 对象存储OSS 阿里云

阿里云OSS实践篇