前端通过post请求上传图片到oss,使用服务端签名直传

简单说明:

根据上一篇我写的【前端上传图片到阿里云】,
这个的上传是通过oss的put方法上传的,并且配置是前端写死的,这样的安全性较低,比较好的方式还是在后台生成签名,后台将签名返回给前端,前端使用签名上传文件到OSS。服务端签名直传适用于上传大文件,客户端上传的数据量较小,适合需要控制上传的安全性的场景。官方文档:服务端签名直传,小程序上传还是之前那个,现在说的是vue的web端上传。这里不用引入ali-oss

1.引入axios

import axios from 'axios'

2.从后端获取签名

这里就需要和后端商量调后端的接口,让后端返回policy和signature,

3.上传oss

 getoss({}).then((res) => {//这个是我调的后端接口,你们改成自己的
        if (res.code == 0) {//调接口成功
          var formData = new FormData()
          //注意formData里append添加的键的大小写
          formData.append('key', url) //存储在oss的文件路径,如 a/b.jpg
          formData.append('OSSAccessKeyId', res.data.accessKeyID) //accessKeyId
          formData.append('policy', res.data.policy) //policy
          formData.append('Signature', res.data.signature) //Signature
          //如果是base64文件,那么直接把base64字符串转成blob对象进行上传就可以了
          formData.append('file', file)
          formData.append('success_action_status', 200) //成功后返回的操作码 
          axios({
            method: 'post',
            //bucketName和region都是可以去oss上得到的
            url: `http://post-test.oss-cn-hangzhou.aliyuncs.com`,   //这个地址是bucketname和区域拼接的
            data: formData,
            withCredentials: false,
            headers: {
              'Content-Type': 'multipart/form-data',
            },
          }).then((value) => { 
            if (value.status == 200) {
              console.log('上传成功', value)
            } else {
              console.log('上传失败', value)
            } 
          })
        }
      })

大致的的思路就是这样,只是之前的配置是写死了,这里可以写死,也可以从后端接口得到,区别就是上一篇用的是put上传,还引入了 “ali-oss”;这里不需要,这里用的就是post上传,同理oss上的跨域规则需要勾选上post请求,
在这里插入图片描述