我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

微信小程序:阿里云OSS直传实践-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

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

基于微信小程序的网上购物平台小程序的设计与实现 服务器端口php+mysql(附源码 调试 文档)

基于微信小程序的网上购物平台小程序 一、引言二、国内外研究现状三、系统需求分析四、系统设计五、系统实现六、系统测试与评估七、结论八、界面展示九、源码获取 摘要 本文介绍了一种基于微信小程序的网上购物平台小程序,该系统主要分为两
基于微信小程序的网上购物平台小程序的设计与实现 服务器端口php+mysql(附源码 调试 文档)
2023-12-22

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录