在thinkphp中使用阿里云OSS自定义驱动上传文件

时间:2023-01-27 09:25:17

在thinkphp3.2版本中使用阿里云的OSS上传文件并不容易,虽然thinkphp已经支持的上传驱动包括Local、Ftp、Sae、Bcs、七牛和又拍云等,但是唯独没有阿里云的OSS驱动。


各种百度和看文档之后,决定使用网友自己写的一个demo来引入OSS驱动,折腾了半天终于成功上传了文件,并且得到了object的键名(也就是OSS对象的文件名)。

该网友的帖子:http://www.thinkphp.cn/extend/566.html     在帖子右上角可以下载该demo,demo的下载地址:http://www.thinkphp.cn/download/566.html

先说明一下:demo中并没有完整的TP框架,熟手可以看着上面链接的帖子自己手动修改配置。


1、配置文件,参考demo中的Config/config.php的配置,写在需要使用OSS访问的模块的配置文件里,比如/Application/Admin/Conf/conf.php:


define('OSS', '*.oss-cn-shanghai.aliyuncs.com/'); //把*替换成对应的Bucket 由于经常用到该链接,所以定义成常量
    'UPLOAD_SITEIMG_OSS' => array (            'maxSize' => 5 * 1024 * 1024,//文件大小            'rootPath' => './',            'saveName' => array ('uniqid', ''),            'savePath' => 'aliyun/',    //保存路径            'driver' => 'Aliyun',            'driverConfig' => array (                    'AccessKeyId' => '你的阿里云AccessKeyId',    //AccessKeyId                    'AccessKeySecret' => '你的阿里云AccessKeySecret',//AccessKeySecret                    'domain' => OSS,        //bucket所在域名                    'Bucket' => 'orange-hehe',         //Bucket名字                    'Endpoint' => 'http://oss-cn-shanghai.aliyuncs.com',                    //如果是杭州的服务器                    //Endpoint设置成                    //'Endpoint' => 'http://oss-cn-hangzhou.aliyuncs.com',        ),    ),


 2、控制器AliyunController.class.php:复制demo中的控制器文件到自己的模块控制器目录下,并修改其命名空间。其他地方不需要修改。


3、引入测试用的HTML模板:复制demo中View/Aliyun目录(也就是index.html)到对应模块的View层目录下。

4、引入uploadify插件上传文件(我只测试了表单上传,JS上传尚未测试):复制demo中的Public/uploadify目录到你的TP项目Public目录下。


5、把驱动代码放到TP的类库中:复制demo中Driver/下的Aliyun目录和Aliyun.class.php到你项目的ThinkPHP/Library/Think/Upload/Driver/目录下。


6、修改上一步中提到的Aliyun.class.php:

①修改private $config:

    private $config = array(
'AccessKeyId' => '你的阿里云accesskeyid', //OSS用户
'AccessKeySecret' => '你的阿里云accesskeysecret', //OSS密码
'domain' =>'http://你的bucket名字.oss-cn-shanghai.aliyuncs.com/', //OSS空间路径,注意自己的域名
'Bucket' => '你的bucket名字', //bucket空间名称
'Endpoint' => 'http://oss-cn-shanghai.aliyuncs.com', //你的bucket所在域名
);
②注释掉构造函数。这是很重要的一点:不注释掉则上传时TP会报错说[EndPoint]is not set,从TP的trace的错误信息中,可以定位到错误原因是由于构造函数里array_merge后把$config给变空了。也有其他的解决办法,此处我用注释掉来解决,简单有效:

<span style="font-size:18px;">    /**
* 构造函数,用于设置上传根路径
* @param array $config 配置
*/
// public function __construct($config){
// /* 默认配置 */
// $this->config = array_merge($this->config, $config);
// }</span>

    

7、此时,已经可以在通过浏览器访问Aliyun/index来上传文件了(JS上传未测,仅测试了表单上传)。如果需要获取上传的OSS文件的object的key的值,则可以在AliyunController.class.php的upload方法里,用:

$object_key = $info['savepath'] . $info['savename']; //$object_key是键名


来获取上传文件的键名了。使用阿里云的OSS的PHP SDK,可以轻松地通过接口把键名转换为可以访问的URL地址,也就可以访问你上传的文件了。

8、(表单上传的原理是:获取$_FILES的tmp_name,然后一系列处理上传到自己的服务器上,然后再移动到阿里云的OSS服务器,如果是阿里云的空间,因为是局域网,速度是非常快的)。