返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >微信小程序:阿里云OSS直传实践-PHP实现服务端签名
  • 450
分享到

微信小程序:阿里云OSS直传实践-PHP实现服务端签名

微信小程序阿里云小程序 2023-09-17 15:09:17 450人浏览 薄情痞子
摘要

目录 1、阿里云OSS上传方式1.1、Web端Browser.js SDK直传(不推荐)1.2、Web端上传服务端再上传至OSS1.3、服务端签名后Web端直传(推荐) 2、PHP服务端

目录

文档

1、阿里云OSS上传方式

1.1、WEB端Browser.js SDK直传(不推荐)

该方法会将AccessKey ID和AccessKey Secret直接保存在浏览器端,存在极高的风险

1.2、Web端上传服务端再上传至OSS

这种方式上传速度慢
在这里插入图片描述

1.3、服务端签名后Web端直传(推荐)

该方式安全性和上传速度都不错,本文采用此方式上传

在这里插入图片描述

2、PHP服务端生成签名

本例服务端签名生成代码通过官网给出的示例修改而来,基于Thinkphp框架

使用了第三方库 ramsey/uuid 生成文件名

安装

composer require ramsey/uuid

官网给的示例有callback 参数,如果是前端使用签名直接传OSS是不需要这个参数的

结合官网给的node.js示例,改造PHP代码

AliOSsService.php

namespace app\service;use Ramsey\Uuid\Uuid;class AliossService{    // 配置oss参数    private const AccessKeyId = '';    private const AccessKeySecret = '';    private const Host = 'https://.oss-cn-beijing.aliyuncs.com';    // 签名有效期 单位: 秒    private const Expire = 3 * 60;    // 允许上传的文件最大和最小范围 单位:字节    private const ContentLengthMin = 0;    private const ContentLengthMax = 20 * 1024 * 1024;        public static function getUploadParams($params)    {        // 接收参数        $ext     = $params['ext'];        $dirname = $params['dirname'];        // 文件路径和文件名        $dir = self::getDirname($dirname);        $key = $dir . self::getFilename($ext);        // 过期时间        $expiration = self::getExpireTime(self::Expire);        // 参数设置        // 附录:Post Policy        // Https://help.aliyun.com/document_detail/31988.htm        $policyParams = [            'expiration' => $expiration,            'conditions' => [                // 指定前缀                ['starts-with', '$key', $dir],                // 限制上传文件大小。单位:字节                ['content-length-range', self::ContentLengthMin, self::ContentLengthMax]            ]        ];        $policyBase64 = self::getPolicyBase64($policyParams);        $signature = self::getSignature($policyBase64, self::AccessKeySecret);        return [            'accessKeyId' => self::AccessKeyId,            'host'        => self::Host,            'policy'      => $policyBase64,            'signature'   => $signature,            'expire'      => $expiration,            'key'         => $key,            'url'         => self::Host . '/' . $key        ];    }        public static function getPolicyBase64($policyParams)    {        return base64_encode(JSON_encode($policyParams));    }        public static function getSignature($policyBase64, $accessKeySecret)    {        return base64_encode(hash_hMac('sha1', $policyBase64, $accessKeySecret, true));    }        public static function getExpireTime($time)    {        return str_replace('+00:00', '.000Z', gmdate('c', time() + $time));    }        public static function getDirname($dirname)    {        return $dirname . '/' . date('Y-m') . '/';    }        public static function getFilename($ext)    {        $uuid = Uuid::uuid4()->toString();        return $uuid . '.' . $ext;    }}

AliOssController.php

namespace app\controller;use app\BaseController;use app\exception\AppException;use app\service\AliOssService;class AliOssController extends BaseController{    public function getUploadParams()    {        $ext     = input('ext');        $dirname = input('dirname', 'image');        // 参数校验        if (!$ext) {            throw new AppException('ext is empty');        }        if (!in_array($dirname, ['image', 'video'], true)) {            throw new AppException('dirname: only allow image or video');        }        $result = AliOssService::getUploadParams([            'ext'     => $ext,            'dirname' => $dirname,        ]);        return $result;    }}

AppException.php

namespace app\exception;use Exception;class AppException extends Exception{}

3、微信小程序客户端

参考官网给出的示例实现

思路:

客户端拿到文件名后缀后,传给服务端,获取签名和文件名等必要的上传参数,让更多的工作在服务端完成

oss-upload-file.js

// 获取文件扩展名function getFilePathExtention(filePath) {  return filePath.split('.').slice(-1)[0];}// 上传到阿里云ossfunction uploadFileAsync(config, filePath) {  console.log(config);  return new Promise((resolve, reject) => {    wx.uploadFile({      url: config.host, // 开发服务器的URL。      filePath: filePath,      name: 'file', // 必须填file。      fORMData: {        key: config.key,        policy: config.policy,        OSSAccessKeyId: config.accessKeyId,        signature: config.signature,        // 'x-oss-security-token': securityToken // 使用STS签名时必传。      },      success: (res) => {        console.log(res);        if (res.statusCode === 204) {          resolve();        } else {          reject('上传失败');        }      },      fail: (err) => {        // console.log(err);        reject(err);      },    });  });}// 上传文件export async function uploadFile(filePath, dirname = 'image') {  console.log(filePath);  let ext = getFilePathExtention(filePath);   // 改方法通过接口获取服务端生成的上传签名   const resParams = await Http.AliOssGetUploadParams({    ext,    dirname,  });  //   console.log(resParams.data);  //   let objectName = resParams.data.uuid + '.' + getFilePathExtention(filePath);  await uploadFileAsync(resParams.data, filePath);  //   console.log(res);  return resParams;}

来源地址:https://blog.csdn.net/mouday/article/details/127389587

--结束END--

本文标题: 微信小程序:阿里云OSS直传实践-PHP实现服务端签名

本文链接: https://lsjlt.com/news/411195.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 微信小程序:阿里云OSS直传实践-PHP实现服务端签名
    目录 1、阿里云OSS上传方式1.1、Web端Browser.js SDK直传(不推荐)1.2、Web端上传服务端再上传至OSS1.3、服务端签名后Web端直传(推荐) 2、PHP服务端...
    99+
    2023-09-17
    微信小程序 阿里云 小程序
  • 阿里云OSS实践文件直传基于服务端
    目录前言优缺点流程逻辑拆解代码实现OSS 配置policy 内容有效期文件名转化 policy进一步分析完整代码前言 在日常开发中,客户端上传文件的一般流程是:客户端向服务端发送文件...
    99+
    2024-04-02
  • 微信小程序实现电子签名
    本文实例为大家分享了微信小程序实现电子签名的具体代码,供大家参考,具体内容如下 <view class="sign-contain"> <view class...
    99+
    2024-04-02
  • 微信小程序实现手写签名
    本文实例为大家分享了微信小程序实现手写签名的具体代码,供大家参考,具体内容如下 本示例具备的功能: 1、笔迹绘制 2、笔迹清空 以下是js代码: var content = null...
    99+
    2024-04-02
  • 微信小程序canvas实现手写签名
    本文实例为大家分享了微信小程序canvas实现手写签名的具体代码,供大家参考,具体内容如下 很多时候,程序中需要用到签名的功能,附上源码(微信小程序) .wxml <view...
    99+
    2024-04-02
  • 微信小程序实现手写签名(签字版)
    本文实例为大家分享了微信小程序实现手写签名的具体代码,供大家参考,具体内容如下 公司近期有个需要用户签名的功能,就用小程序canvas写了个 wxml <view class...
    99+
    2024-04-02
  • python 阿里云oss实现直传签名与回调验证的示例方法
    签名 import base64 import json import time from datetime import datetime import hmac from ...
    99+
    2024-04-02
  • 微信小程序怎么实现手写签名
    本文小编为大家详细介绍“微信小程序怎么实现手写签名”,内容详细,步骤清晰,细节处理妥当,希望这篇“微信小程序怎么实现手写签名”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。在微信小程序上实现手写签名,获取canva...
    99+
    2023-06-29
  • 微信小程序如何实现手写签名
    这篇文章主要介绍了微信小程序如何实现手写签名的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇微信小程序如何实现手写签名文章都会有所收获,下面我们一起来看看吧。效果wxml<view class=&...
    99+
    2023-07-02
  • 微信小程序用canvas实现电子签名
    本文实例为大家分享了微信小程序用canvas实现电子签名的具体代码,供大家参考,具体内容如下 <view class="sign-contain">     <vi...
    99+
    2024-04-02
  • 微信小程序实现横屏手写签名
    本文实例为大家分享了微信小程序实现横屏手写签名的具体代码,供大家参考,具体内容如下 1.关键配置: "pageOrientation": "landsc...
    99+
    2024-04-02
  • 微信小程序怎么实现电子签名
    要在微信小程序中实现电子签名,可以按照以下步骤操作:1. 在小程序页面中创建一个画布(canvas)组件,用于绘制签名。可以使用 `...
    99+
    2023-08-18
    微信小程序
  • 微信小程序怎么用canvas实现电子签名
    这篇文章主要介绍“微信小程序怎么用canvas实现电子签名”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“微信小程序怎么用canvas实现电子签名”文章能帮助大家解决问题。具体代码如下<view...
    99+
    2023-07-02
  • 微信小程序实现手写签名的示例代码
    目录1.效果图2.相关代码canvas代码js相关在微信小程序上实现手写签名,获取canvascontext新版本和旧版本有点坑,新版本在获取canvas后如果页面有滑动,则签名坐标...
    99+
    2024-04-02
  • 微信小程序实现横屏和竖屏签名功能
    本文实例为大家分享了微信小程序实现横屏和竖屏签名的具体代码,供大家参考,具体内容如下 wxml <view class="container">   <canvas...
    99+
    2024-04-02
  • 微信小程序如何实现上传图片到php服务器
    这篇文章将为大家详细讲解有关微信小程序如何实现上传图片到php服务器,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。js代码如下 submitPhoto(){ &...
    99+
    2024-04-02
  • uniapp实现微信小程序的电子签名效果(附demo)
    目录1、标签和样式2、横屏切换3、绘图3.1、初始化数据会吧?3.2、触摸开始时获取起点,会吧?3.3、触摸移动获取路径点,会吧?3.4、触摸结束,将未绘制的点清空防止对后续路径产生...
    99+
    2024-04-02
  • 微信小程序怎么实现简单手写签名组件
    这篇文章主要介绍了微信小程序怎么实现简单手写签名组件的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇微信小程序怎么实现简单手写签名组件文章都会有所收获,下面我们一起来看看吧。需求:可以实现用户在微信小程序上手写签...
    99+
    2023-06-08
  • 微信小程序怎么实现一个手写签名组件
    这期内容当中小编将会给大家带来有关微信小程序怎么实现一个手写签名组件,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。背景:在做项目过程中,需要在微信小程序中实现手写签名组件。在网上找了微信小程序手写签名实现...
    99+
    2023-06-20
  • uniapp怎么实现微信小程序的电子签名效果
    今天小编给大家分享一下uniapp怎么实现微信小程序的电子签名效果的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。开发框架:u...
    99+
    2023-06-30
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作