您的当前位置:首页>全部文章>文章详情

【PHP】TP上传图片到OSS

CrazyPanda发表于:2024-03-23 18:21:38浏览:400次TAG:

准备:

php版本:7.4

tp版本:6.0

阿里云accessKeyId;

阿里云accessKeySecret;

阿里云存储bucket名称,如 examplebucket;

地域节点endpoint,如:oss-cn-hangzhou.aliyuncs.com;


1. 安装SDK

参考官网https://help.aliyun.com/zh/oss/developer-reference/installation-13?spm=a2c4g.11186623.0.0.568f6583XllxTu

这里我们使用composer安装

composer require aliyuncs/oss-sdk-php

下载后composer.json文件里面显示

"aliyuncs/oss-sdk-php": "^2.7"


2. 上传文件到OSS

参考官网:https://help.aliyun.com/zh/oss/developer-reference/simple-upload?spm=a2c4g.11186623.0.0.75b95347Cv3irf

SDK提供了好几种上传文件的方法

直接上传文件对象

/**
     * Uploads a local file
     *
     * @param string $bucket bucket name
     * @param string $object object name
     * @param string $file local file path
     * @param array $options
     * @return array|null
     * @throws OssException|RequestCore_Exception
     */
    public function uploadFile($bucket, $object, $file, $options = NULL)

上传文件内容

/**
     * Uploads object from file handle
     *
     * @param string $bucket bucket name
     * @param string $object object name
     * @param resource $handle file handle
     * @param array $options
     * @return array|null
     * @throws OssException|RequestCore_Exception
     */
    public function uploadStream($bucket, $object, $handle, $options = NULL)

结合我们的业务需要,因为客户端直接上传的是文件对象,所有我们采用uploadFile方法。


uploadFile参数说明:

第一个参数bucket:存储空间bucket的名称

第二个参数object:存储文件的名称(原以为是文件对象,实际上是存储文件的名称,可以包含路径,比如 '2024/01/01/xxx.png')

第三个参数file:文件的本地路径,根据这个路径获取文件,并上传保存到第二个参数对应的文件


封装的上传文件类

<?php

namespace app\service;

use app\model\SysConfig;
use OSS\Core\OssException;
use OSS\OssClient;
use think\facade\Log;

class OssService
{
    private $accessKeyId = '';
    private $accessKeySecret = '';
    private $bucket = '';
    private $endpoint = '';


    /**
     * 构造方法
     * @access public
     * @param  App  $app  应用对象
     */
    public function __construct()
    {
        $this->accessKeyId = SysConfig::get('accessKeyId');
        $this->accessKeySecret = SysConfig::get('accessKeySecret');
        $this->bucket = SysConfig::get('bucket');
        $this->endpoint = SysConfig::get('endpoint');
    }

    /**
     * 上传文件
     * @param $file_path 文件路径
     * @param $file_name 文件名称
     * @return mixed|string
     * @throws \OSS\Http\RequestCore_Exception
     */
    public function save($file_path,$file_name)
    {
        try {
            //实例化
            $ossClient = new OssClient($this->accessKeyId, $this->accessKeySecret, $this->endpoint);
            //生成文件名 连接后缀
            $save_name = date('Y').'/'.date('m').'/'.date('d') .'/'. $file_name;
            //Log::info($save_name);
            //执行阿里云上传
            $result = $ossClient->uploadFile($this->bucket, $save_name, $file_path);
            //Log::info($result);
            
            if (!empty($result['info']['url']))
            {
                return $result['info']['url'];
            }
        } catch (OssException $e) {
            //Log::info($e->getMessage());

        }

        return '';
    }
}


上传文件接口

public function addImg($cid)
    {
        $file = $this->request->file('file');
        $files = $_FILES['file'];
        $oss = new OssService();
        $file_name = md5($file->getOriginalName()) . '.' . $file->getOriginalExtension();
        $tmp_name = $files['tmp_name'];//上传文件的缓存路径
        $url = $oss->save($tmp_name,$file_name);
        
        if (!empty($url))
        {
             $this->success('成功',['url' => $url]);
        }
        else
        {
            $this->error('失败');
        }
    }

已上就是本次tp使用阿里云SDK上传OSS的操作。


后记

原想只是一个简单上传,想要直接使用阿里云提供的API,但是API里面一些签名什么的还要花时间做,最终还是选择了使用SDK更快捷方便。


猜你喜欢

【PHP】步骤详解Centos中编译安装php8与配置方法
本篇文章给大家带来了关于php的相关知识,其中主要介绍了在Centos系统中是如何编译安装php,以及如何正确配置的,步骤很详细!感兴趣的朋友下面一起来看一下吧,希望对大家有帮助。PHP(全称:PHP:Hypertext Preprocessor,即“PHP:超文本预处理器”)是一种开源的通用计算机脚本语言,尤其适用于网络开发并可嵌入HTML中使用。PHP的语法借鉴吸收C语言、Java和Perl等流行计算机语言的特点,易于一般程序员学习。PHP的主要目标是允许网络开发人员快速编写动态页面。准备工
发表于:2024-01-06 浏览:339 TAG:
【PHP】php8为什么性能高
hp8性能高的原因:php8引入了JIT编译器、优化了函数调用、数组操作、引入了新的数据结构和算法,并修复和优化了一些内部实现细节等等。详细介绍:1、引入了Just-In-Time(JIT)编译器,JIT编译器是一种动态编译技术,它将PHP代码转换为机器码,以便更高效地执行;2、优化了函数调用,在PHP8中,通过引入函数调用的内联缓存(IC)机制,可以避免昂贵的开销等等。本教程操作系统:windows10系统、PHP8版本、Dell G3电脑。PHP是一种广泛使用的服务器端脚本语言,用于开发W
发表于:2023-12-30 浏览:321 TAG:
【PHP】PHP中的堆和栈的概念及其应用
hp作为一门非常流行的编程语言,其对于数据结构的处理和使用具有非常重要的作用。而在php中,堆和栈是两种非常重要的数据结构,它们在程序设计和实现中有着重要的应用价值。本文将从概念和应用两方面介绍php中的堆和栈。一、堆和栈的概念堆堆是一种数据结构,它是一种特殊的树形结构。在PHP中,堆是由节点和边组成的一种图形式的数据结构。堆中每个节点都有一个值,并且每个节点的值都满足一定的关系,即父节点的值大于等于子节点的值(大根堆)或父节点的值小于等于子节点的值(小根堆)。在PHP中,堆通常是用来进行高效
发表于:2024-07-29 浏览:283 TAG:
【PHP】php生僻字处理方法
在日常的PHP编程中,我们难免会遇到一些中文生僻字,这些字虽然不常用,但在一些特定的场合下却是必须要用到的。下面我们就来探讨一下PHP处理生僻字的几种方法。一、使用Unicode编码Unicode是一种国际化字符集,它可以表示几乎所有的字符,包括中文生僻字。在PHP中,使用Unicode编码处理生僻字,一般需要使用PHP内置函数chr()和ord()。chr()函数chr()函数可以将一个Unicode码转换为对应的字符,其语法如下:string&nbsp;chr(int&nbsp;$
发表于:2023-12-29 浏览:369 TAG:
【PHP】php将字符串拆分成数组有哪些方法
方法有:1、explode()函数,可以将字符串按指定的分隔符拆分成数组;2、str_split()函数,可以将字符串拆分成单个字符的数组;3、preg_split()函数,可以根据正则表达式将字符串拆分成数组;4、sscanf()函数,可以根据指定的格式解析字符串,并将解析结果存入数组中;5、字符串截取方法,通过使用字符串截取函数,可以将字符串按指定长度拆分成数组等。本教程操作系统:Windows10系统、PHP8.1.3版本、Dell G3电脑。在PHP中,将字符串拆分成数组有多种
发表于:2023-12-04 浏览:647 TAG:
【PHP】PHP 8.3 大升级:20 个新特性全面解析
PHP 8.3 是流行的服务器端脚本语言的最新版本,带来了许多新功能和改进,旨在简化 Web 开发并提高性能。这些增强功能包括只读类、新函数 json_validate() 、Randomizer 类的扩展以及更合适的日期/时间异常。它们将彻底改变 PHP 开发体验,使其更加高效、安全,以满足 Web 开发人员和企业的需求。1. Readonly 类改进PHP 8.3 对只读类进行了重大改进,使开发人员能够更灵活地控制其代码。其中一个显著的变化是允许在克隆时重新初始化只读属性,解决了特
发表于:2023-12-04 浏览:556 TAG:
【PHP】TP使用Intervention\Image在图片上绘制矩形、文字
1. 在图片上绘制矩形use&nbsp;Intervention\Image\ImageManagerStatic&nbsp;as&nbsp;Image; &nbsp; public&nbsp;function&nbsp;drawRectangle() { &nbsp;&nbsp;&nbsp;&nbsp;$image&nbsp;=&nbsp;Image::make(&#39;path/to/your/image.jpg&#39;);&nbsp;//&nbsp;替换为你的图片路径 &nbsp; &amp;
发表于:2024-04-12 浏览:374 TAG:
【PHP】php网络服务器有哪些软件
php网络服务器有Apache HTTP Server、Nginx、Microsoft Internet Information Services、Lighttpd和Caddy等。详细介绍:1、Apache HTTP Server,Apache是最流行的开源Web服务器软件之一,广泛应用于PHP开发,它稳定、可靠,支持多平台,具有丰富的功能和灵活的配置选项;2、Nginx等等。本教程操作系统:windows10系统、PHP 8.1.3版本、DELL G3电脑。在PHP开发中,常用的网络
发表于:2023-12-04 浏览:564 TAG:
【RabbitMQ】RabbitMQ五种消息模型
‌RabbitMQ提供了五种消息模型,分别是基本消息模型、工作模型、Fanout订阅模型、Direct订阅模型和Topic订阅模型‌。这些模型在消息的发送、路由和消费方式上有所不同,适用于不同的应用场景。‌
发表于:2025-02-08 浏览:90 TAG: #RabbitMQ
【PHP】PHP去除字符串中的标点符号
1. 使用str_replace()2. 使用正则表达式3. 使用ctype_punct函数4. 去除中文字符
发表于:2024-11-11 浏览:236 TAG: #php