uniapp 图片上传到OSS 阿里云对象存储

需求:

将拍摄的图片或者从相册中选取的图片直接上传存储到 OSS ,不传服务器

参考:

阿里云官方文档

1)注册阿里云账号,开通OSS对象存储,创建阿里云oss许可证

2)按照官方文档步骤,前端后端协作(其中,签名这里可以前端做也可以后端做)

具体步骤:

项目中选择客户端签名(即前端做签名),具体的实施步骤为:

步骤1:配置Bucket跨域访问

步骤2:微信小程序配置域名白名单

步骤3:获取签名

    后端搭建STS服务,向前端提供以下数据

        OSSAccessKeyId  及  x-oss-security-token

    前端获取STS临时访问凭证并生成签名

  • 获取签名文件(getSignature.js)
	// 注意:crypto-js,js-base64 需要通过 npm install 进行安装
    import crypto from 'crypto-js';
	import { Base64 } from 'js-base64';
	import http from "@/utils/request.js"; //引入luch-request封装的请求拦截,响应拦截
	/**
	 * 1.  获取阿里云签名信息
	 */
	function getAliOssInfo() {
		return http.post('api/ali/getAliSTS') //接口由后台提供
	}
	
	// 计算签名。
	function computeSignature(accessKeySecret, canonicalString) {
	  return crypto.enc.Base64.stringify(crypto.HmacSHA1(canonicalString, accessKeySecret));
	}
	
	const date = new Date();
	date.setHours(date.getHours() + 1);
	console.log('时间',date.toISOString())
	const policyText = {
	  expiration: date.toISOString(), // 设置policy过期时间。
	  conditions: [
	    // 限制上传大小。
	    ["content-length-range", 0, 1024 * 1024 * 1024],
	  ],
	};
	
	export const getFormDataParams=async()=>{
		console.log('开始签名')
	  const  {data:res}= await getAliOssInfo()
	  console.log(res)
	  if(res.code===0){
		let credentials=res.data 
		const policy = Base64.encode(JSON.stringify(policyText)) // policy必须为base64的string。
		const signature = computeSignature(credentials.AccessKeySecret, policy)
	  
	    console.log('credentials',credentials)
		const formData = {
			// OSSAccessKeyId: credentials.AccessKeyId,
			OSSAccessKeyId: credentials.AccessKeyId,
			signature,
			policy,
			'x-oss-security-token': credentials.SecurityToken 
		}
		console.log('签名',formData)
		return formData
	  }else{
		console.log(res.msg)
	  }
	 
	 
	}
  • 上传图片至OSS(oss.js)

        利用uni.upload上传文件,封装为单独js

	
	import {getFormDataParams} from '@/utils/oss/getSignature.js'
	
	/**
	 * 2. 图片上传到oss
	 */
	export const uploadOss=async({
		filePathFore,filePath
	})=>{
		return new Promise( async (resolve) => {
		console.log('开始oss')
		 const res = await getFormDataParams() //请求后台获取oss签名信息
		
		 console.log('oss',res)
	
		//获取文件扩展名,根据后台返回的值而取
		let fileType = filePath.substring(filePath.lastIndexOf('.')) || '.jpg' //获取图片类型后缀 .jpg .png
		// 获取时间格式
		const time=uni.$u.timeFormat(new Date().getTime(), 'yyyymmddhhMMss')
		// const userId=uni.getStorageSync('userInfo').stu_id

		let key = `${filePathFore}${time}${fileType}` //那么我们上传到oss上,路径就是 filePathFore/20211112.png ,filePathFore 由后端接口中获取
		console.log('key',key)
		const host ='https://sxoss.lookdeep.cn/'
		uni.uploadFile({
			url: host,
			filePath: filePath,
			name: 'file', // 必须填file。
			formData: {
			    key,//文件名
			    policy:res.policy,//后台获取超时时间
			    OSSAccessKeyId: res.OSSAccessKeyId,//后台获取临时ID
			    signature:res.signature,//后台获取签名
			    'x-oss-security-token': res['x-oss-security-token'] ,// 使用STS签名时必传。
				success_action_status: '200', //让服务端返回200,不然,默认会返回204
			},
			success: (res) => {
				console.log('结果',res)
			    if (res.statusCode === 200) {
			    console.log('上传成功');
				  
				resolve(key) //上传成功后,将我们所自定义的key(文件路径名)返回出去
			    }
			},
			fail: err => {
			    console.log(err);
			}
		})

		// }
		})
			
		
		
	}

步骤4:使用

// 导入封装好的 上传oss 函数
import { uploadOss } from '@/utils/oss/oss_1.js'


// 使用:从相册选取照片上传到 OSS
 uni.chooseImage({
            count: 1,
            sizeType: ['original'], //可以指定是原图还是压缩图,默认二者都有
            sourceType: ['album'], //从相册选择
            success: async (res) => {
              
              // OSS上传(得到在oss文件夹下照片路径)
              this.ossPath = await uploadOss({
                filePathFore: this.foldPath,
                filePath: res.tempFilePaths[0],
              })

})

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值