阿里云OSS轻量级Driver
不用加载官方那一大坨sdk了,简单一点
看过网上的一些例子都过于复杂,包含了官方的phpsdk那一大坨东西,理论上我只需要简单的上传文件而已,不需要那么多东西,于是自己写了一下。
以下代码保存到/yourpath/ThinkPHP/Library/Think/Upload/Driver/Oss.class.php即可<?php<br />
<br />
// ----------------------------------------------------------------------<br />
// | ThinkPHP [ WE CAN DO IT JUST THINK IT ]<br />
// ----------------------------------------------------------------------<br />
// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved.<br />
// ----------------------------------------------------------------------<br />
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )<br />
// ----------------------------------------------------------------------<br />
// | Author: 废墟 <r.anerg@gmail.com> <http://anerg.com><br>
// ----------------------------------------------------------------------<br>
<br>
namespace ThinkUploadDriver;<br>
<br>
class Oss {<br>
<br>
const OSS_HOST = 'oss.aliyuncs.com';<br>
<br>
/**<br>
* 上传文件根目录<br>
* @var string<br>
*/<br>
private $rootPath;<br>
<br>
/**<br>
* 上传错误信息<br>
* @var string<br>
*/<br>
private $error = '';<br>
private $config = array(<br>
'access_id' => '', //阿里云Access Key ID<br>
'access_key' => '', //阿里云Access Key Secret<br>
'bucket' => '', //空间名称<br>
'timeout' => 90, //超时时间<br>
);<br>
<br>
/**<br>
* 构造函数,用于设置上传根路径<br>
* @param array $config FTP配置<br>
*/<br>
public function __construct($config) {<br>
/* 默认FTP配置 */<br>
$this->config = array_merge($this->config, $config);<br>
}<br>
<br>
/**<br>
* 检测上传根目录(阿里云上传时支持自动创建目录,直接返回)<br>
* @param string $rootpath 根目录<br>
* @return boolean true-检测通过,false-检测失败<br>
*/<br>
public function checkRootPath($rootpath) {<br>
/* 设置根目录 */<br>
$this->rootPath = trim($rootpath, './') . '/';<br>
return true;<br>
}<br>
<br>
/**<br>
* 检测上传目录(阿里云上传时支持自动创建目录,直接返回)<br>
* @param string $savepath 上传目录<br>
* @return boolean 检测结果,true-通过,false-失败<br>
*/<br>
public function checkSavePath($savepath) {<br>
return true;<br>
}<br>
<br>
/**<br>
* 创建文件夹 (阿里云上传时支持自动创建目录,直接返回)<br> * @param string $savepath 目录名称<br>
* @return boolean true-创建成功,false-创建失败<br>
*/<br>
公共函数 mkdir($savepath) {<br>
返回 true;<br>
}<br>
<br>
/**<br>
* 保存指定文件<br>
* @param array $file 保存的文件信息<br>
* @param boolean $replace 同名文件是否覆盖<br>
* @return boolean 保存状态,true-成功,false-失败<br>
*/<br>
公共函数保存($文件,$替换= true){<br>
$_headers = array('内容类型:''.$file['type']);<br>
$resource=fopen($file['tmp_name'],'r');<br>
<br>
$path=$this->rootPath. $file['savepath'] . $file['保存名称'];<br>
<br>
$uri = "/{$this->config['bucket']}{$path}";<br>
$ch = curl_init('http://' . self::OSS_HOST . $uri);<br>
<br>
$date = gmdate('D, d M Y H:i:s GMT');<br>
<br>
array_push($_headers,“日期:{$date}”);<br>
<br>
$sign_string =“PUTnn”。 $文件['类型']。 “n”。 $日期。 “n”。 $uri;<br>
$sign = $this->hex_to_base64(hash_hmac('sha1', $sign_string, $this->config['access_key']));<br>
<br>
array_push($_headers,'授权:OSS''.$this->config['access_id'].':'.$sign);<br>
<br>
fseek($resource, 0, SEEK_END);<br>
$length=ftell($resource);<br>
fseek($resource, 0);<br>
<br>
array_push($_headers,“内容长度:{$length}”);<br>
<br>
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");<br>
curl_setopt($ch, CURLOPT_POST, 1);<br>
curl_setopt($ch, CURLOPT_INFILE, $resource);<br>
curl_setopt($ch, CURLOPT_INFILESIZE, $length);<br>
curl_setopt($ch, CURLOPT_HTTPHEADER, $_headers);<br>
curl_setopt($ch, CURLOPT_TIMEOUT, $this->config['timeout']);<br>
curl_setopt($ch, CURLOPT_HEADER, 1);<br>
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);<br>
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 0);<br>
$response = curl_exec($ch);<br>
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);<br>
fclose($资源);<br>
如果($status==200){<br>
返回 true;<br>
} 其他 {<br>
$this->错误=$response;<br> return false;<br>
}<br>
}<br>
<br>
/**<br>
* 获取最后一次上传错误信息<br>
* @return string 错误信息<br>
*/<br>
public function getError() {<br>
return $this->error;<br>
}<br>
<br>
<br>
private function hex_to_base64($str) {<br>
$result = '';<br>
<br>
for ($i = 0; $i < strlen($str); $i = 2) {<br />
$result .= chr(hexdec(substr($str, $i, 2)));<br />
}<br />
<br />
return base64_encode($result);<br />
}<br />
<br />
}
使用方法也比较简单,如果只有一个bucket则可以把配置写入config.php里,内容如下'FILE_UPLOAD_TYPE' => 'Oss',<code class="prettyprint linenums lang-php">'FILE_UPLOAD_TYPE' => 'Oss',<br>
'UPLOAD_TYPE_CONFIG' => array(<br>
'access_id' => 'access_id', //阿里云Access Key ID<br>
'access_key' => 'access_key', //阿里云Access Key Secret<br>
'bucket' => 'bucket' //阿里云的bucket<br>
),
'UPLOAD_TYPE_CONFIG' => array($config = array(<br>
'maxSize' => 0,<br>
'exts' => array('jpg', 'jpeg', 'png'),<br>
'saveName' => array('uniq_photo_name', '__FILE__'),<br>
'rootPath' => '/',<br>
);<br>
$oss_config = array(<br>
'access_id' => 'access_id', //阿里云Access Key ID<br>
'access_key' => 'access_key', //阿里云Access Key Secret<br>
'bucket' => 'bucket'<br>
);<br>
$upload = new ThinkUpload($config, 'Oss', $oss_config);
'access_id' => 'access_id', //阿里云Access Key ID
'access_key' => 'access_key', //阿里云Access Key Secret
'bucket' => 'bucket' //阿里云的bucket ),如果你需要将不同的文件存入不同的bucket则需要在上传方法中采用动态配置$config = array(
'maxSize' => 0,
'exts' => array('jpg', 'jpeg', 'png'),
'saveName' => array('uniq_photo_name', '__FILE__'),
'rootPath' => '/',
);
$oss_config = array(
'access_id' => 'access_id', //阿里云Access Key ID
'access_key' => 'access_key', //阿里云Access Key Secret
'bucket' => 'bucket'
);
$upload = new ThinkUpload($config, 'Oss', $oss_config); AD:真正免费,域名 虚机 企业邮箱=0元

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

《Go语言编程实例:Web开发中的代码示例》随着互联网的快速发展,Web开发已经成为各行业中必不可少的一部分。作为一门功能强大且性能优越的编程语言,Go语言在Web开发中越来越受到开发者们的青睐。本文将通过具体的代码示例,介绍如何利用Go语言进行Web开发,让读者能够更好地理解和运用Go语言来构建自己的Web应用。1.简单的HTTP服务器首先,让我们从一个

了解Python编程的入门级代码示例Python是一种简单易学,功能强大的编程语言。对于初学者来说,了解Python编程的入门级代码示例是非常重要的。本文将为您提供一些具体的代码示例,帮助您快速入门。打印HelloWorldprint("HelloWorld")这是Python中最简单的代码示例。print()函数用于将指定的内容输出

PHP变量存储程序运行期间的值,对于构建动态且交互式的WEB应用程序至关重要。本文将深入探讨php变量,并通过10个真实的示例展示它们的实际应用。1.存储用户输入$username=$_POST["username"];$passWord=$_POST["password"];此示例从表单提交中提取用户名和密码,并将其存储在变量中以供进一步处理。2.设置配置值$database_host="localhost";$database_username="username";$database_pa

华为云边缘计算对接指南:Java代码示例快速实现接口随着物联网技术的快速发展和边缘计算的兴起,越来越多的企业开始关注边缘计算的应用。华为云提供了边缘计算服务,为企业提供了高可靠的计算资源和便捷的开发环境,使得边缘计算应用更加容易实现。本文将介绍如何通过Java代码快速实现华为云边缘计算的接口。首先,我们需要准备好开发环境。确保你已经安装了Java开发工具包(

Java冒泡排序最简单的代码示例冒泡排序是一种常见的排序算法,它的基本思想是通过相邻元素的比较和交换来将待排序序列逐步调整为有序序列。下面是一个简单的Java代码示例,演示了如何实现冒泡排序:publicclassBubbleSort{publicstaticvoidbubbleSort(int[]arr){int

如何使用PHP编写库存管理系统中的库存分仓管理功能代码库存管理是许多企业中不可或缺的一部分。对于拥有多个仓库的企业来说,库存分仓管理功能尤为重要。通过合理管理和跟踪库存,企业可以实现不同仓库之间的库存调拨,优化运营成本,改善协同效率。本文将介绍如何使用PHP编写库存分仓管理功能的代码,并为您提供相关的代码示例。一、建立数据库在开始编写库存分仓管理功能的代码之

标题:从入门到精通:Go语言中常用数据结构的代码实现数据结构在编程中起着至关重要的作用,它是程序设计的基础。在Go语言中,有许多常用的数据结构,掌握这些数据结构的实现方式对于成为一名优秀的程序员至关重要。本文将介绍Go语言中常用的数据结构,并给出相应的代码示例,帮助读者从入门到精通这些数据结构。1.数组(Array)数组是一种基本的数据结构,是一组相同类型

Java选择排序法代码编写指南及示例选择排序是一种简单直观的排序算法,其思想是每次从未排序的元素中选择最小(或最大)的元素进行交换,直到所有元素排序完成。本文将提供选择排序的代码编写指南,并附上具体的Java示例代码。算法原理选择排序的基本原理是将待排序数组分为已排序和未排序两部分,每次从未排序部分选择最小(或最大)的元素,将其放到已排序部分的末尾。重复上述
