开发者社区 > 云存储 > 对象存储OSS > 正文

微信小程序请求服务端签名,直连上传图片到OSS

  • JDK版本:1.8
  • oss sdk版本:aliyun-sdk-oss3.15.2
  • 服务端签名
   long expireEndTime = System.currentTimeMillis() + 21600* 1000  ;
            Date expiration = new Date(expireEndTime);
            // 上传空间
            String uploadDir = DateTimeUtils.getDateTime("yyyyMMdd", expiration);
            PolicyConditions policyCons = new PolicyConditions();
            policyCons.addConditionItem(PolicyConditions.COND_CONTENT_LENGTH_RANGE, 0, 1048576000);
            policyCons.addConditionItem(MatchMode.StartWith, PolicyConditions.COND_KEY, uploadDir);
            // 生成post请求策略
            String postPolicy = ossClient().generatePostPolicy(expiration, policyCons);
            byte[] binaryData = postPolicy.getBytes(StandardCharsets.UTF_8);
            String encodedPolicy = BinaryUtil.toBase64String(binaryData);
            // 生成签名用于直连上传
            String postSignature = ossClient().calculatePostSignature(postPolicy);
            // 构建
            OssPolicy ossPolicy = new OssPolicy();
            ossPolicy.setPolicy(encodedPolicy);
            ossPolicy.setAccessKeyId(ossConfig().getAccessKeyId());
            ossPolicy.setSignature(postSignature);
            ossPolicy.setExpireEndTime((expireEndTime - 28800 * 1000)/ 1000);
            ossPolicy.setDir(uploadDir);
            // 前端上传域名
            ossPolicy.setHost(ossConfig().getHost());
  • 小程序直连上传
        let imgSignature = {}
		if (!oldExpireEndTime || oldExpireEndTime <= Math.round(new Date().getTime() / 1000)) {
			const { data } = await that.$api.generatePolicy()
			imgSignature = data.body
			uni.setStorageSync("imgSignature", imgSignature)
		} else {
			imgSignature = uni.getStorageSync("imgSignature")
		}
		const { accessKeyId, policy, signature, dir, host, expireEndTime } = imgSignature
		const key = `${dir}/user-${userId}-${new Date().getTime()}.png`
		const queryInfo = {
			key,
			policy,
			OSSAccessKeyId: accessKeyId,
			signature,
			expireEndTime,
		}
		uni.uploadFile({
			url: host,
			filePath,
			name: "file",
			formData: queryInfo,
			success: (res) => {
				
				if (res.statusCode === 204) resolve(host + "/" + key)
				else reject()
			},
			fail: (err) => {
				
				reject()
			},
		})
  • 出现问题 Invalid according to Policy: Policy expired。policy的过期时间设置为六个小时了。

展开
收起
游客bvxvcc66yhnfo 2023-01-06 16:36:58 580 2
3 条回答
写回答
取消 提交回答
  • 公众号:网络技术联盟站,InfoQ签约作者,阿里云社区签约作者,华为云 云享专家,BOSS直聘 创作王者,腾讯课堂创作领航员,博客+论坛:https://www.wljslmz.cn,工程师导航:https://www.wljslmz.com

    policy在oss中也是需要设置的,可以先检查一下。

    2023-01-31 12:12:01
    赞同 展开评论 打赏
  • 这些事情太复杂,一时搞不明白。

    2023-01-12 08:23:20
    赞同 展开评论 打赏
  • 面对过去,不要迷离;面对未来,不必彷徨;活在今天,你只要把自己完全展示给别人看。

    开通oss服务和创建oss存储空间啦,可以参考文档意见

    2023-01-06 18:53:08
    赞同 展开评论 打赏

对象存储 OSS 是一款安全、稳定、高性价比、高性能的云存储服务,可以帮助各行业的客户在互联网应用、大数据分析、机器学习、数据归档等各种使用场景存储任意数量的数据,以及进行任意位置的访问,同时通过丰富的数据处理能力更便捷地使用数据。

相关产品

  • 对象存储
  • 热门讨论

    热门文章

    相关电子书

    更多
    OSS运维进阶实战手册 立即下载
    《OSS运维基础实战手册》 立即下载
    OSS运维基础实战手册 立即下载