在OneThink的后台(以下称为OT),默认的文件上传和图片上传方式是上传至网站根目录下的/Upload/目录下。ThinkPHP支持七牛云,Bcs云上传方式,通过参考手册可以把OT后台配置为对应的上传方式。
之前也写过一篇ThinkPHP中引入阿里云OSS文件上传的博客,但是并不适用与OneThink的后台文件上传。因为OneThink的后台文件上传方式,是通过配置模型的字段来完成的,比如我需要一个blog表,我就需要新建一个名字为blog的模型,为其添加各种所需的字段,其中包含一种类型为“文件上传”或者“图片上传”的类型,这样我们就不需要复写模板的表单页,来完成各种字段该有的功能。
下面介绍下,在OT后台配置阿里云OSS文件上传的方式(支持编辑器内文件和图片上传):
1、下载配置所需的OSS driver等文件:
下载链接为:http://pan.baidu.com/s/1c2OmaWS 密码: fau7
把下载好的目录里的Aliyun.class.php和Aliyun目录,放在/ThinkPHP/Library/Think/Upload/Driver/目录下。
在Aliyun.class.php里,可以看到代码里引入了一些常量来表示。
2、配置文件修改
/Application/Common/common.php新增代码(也可以在/Application/Common/Conf/config.php配置):
这些常量就是之前Aliyun.class.php里的常量
define('OSS', ''); //oss外网域名
define('OSS_AccessKeyId', ''); //OSS用户
define('OSS_AccessKeySecret', ''); //OSS密码
define('OSS_Bucket', ''); //空间名称
define('OSS_Endpoint', ''); //OSS节点的URL
define('OSS_timeout', 600); //超时时间
/Application/Admin/Conf/config.php关于文件和图片上传配置改为如下配置:
/* 文件上传相关配置 */
'DOWNLOAD_UPLOAD' => array(
'mimes' => '', //允许上传的文件MiMe类型
'maxSize' => 500*1024*1024, //上传的文件大小限制 (0-不做限制)
'exts' => 'jpg,gif,png,jpeg,zip,rar,tar,gz,7z,doc,docx,txt,xml,mp4,avi,rmvb,flv,mkv,wmv,pdf', //允许上传的文件后缀
'autoSub' => true, //自动子目录保存文件
'subName' => array('date', 'Y-m-d'), //子目录创建方式,[0]-函数名,[1]-参数,多个参数使用数组
'rootPath' => OSS, //保存根路径
'savePath' => '', //保存路径
'saveName' => array('uniqid', ''), //上传文件命名规则,[0]-函数名,[1]-参数,多个参数使用数组
'saveExt' => '', //文件保存后缀,空则使用原后缀
'replace' => false, //存在同名是否覆盖
'hash' => true, //是否生成hash编码
'callback' => false, //检测文件是否存在回调函数,如果存在返回文件信息数组
),
//下载模型上传配置(文件上传类配置)
/* 图片上传相关配置 */
'PICTURE_UPLOAD' => array(
'mimes' => '', //允许上传的文件MiMe类型
'maxSize' => 50*1024*1024, //上传的文件大小限制 (0-不做限制)
'exts' => 'jpg,gif,png,jpeg,gif', //允许上传的文件后缀
'autoSub' => true, //自动子目录保存文件
'subName' => array('date', 'Y-m-d'), //子目录创建方式,[0]-函数名,[1]-参数,多个参数使用数组
'rootPath' => 'h'.OSS, //保存根路径为阿里云OSS,加h是为了补全http的h
'savePath' => '', //保存路径
'saveName' => array('uniqid', ''), //上传文件命名规则,[0]-函数名,[1]-参数,多个参数使用数组
'saveExt' => '', //文件保存后缀,空则使用原后缀
'replace' => false, //存在同名是否覆盖
'hash' => true, //是否生成hash编码
'callback' => false, //检测文件是否存在回调函数,如果存在返回文件信息数组
),
//图片上传相关配置(文件上传类配置)
'DOWNLOAD_UPLOAD_DRIVER'=>'aliyun',
'PICTURE_UPLOAD_DRIVER'=>'aliyun',//OSS图片上传方法之二,走的是TP的上传驱动
'FILE_UPLOAD_TYPE'=>'aliyun', //OSS文件上传,走的是TP的上传驱动
//本地上传文件驱动配置
// 'UPLOAD_LOCAL_CONFIG'=>array(),
// 'UPLOAD_BCS_CONFIG'=>array(
// 'AccessKey'=>'',
// 'SecretKey'=>'',
// 'bucket'=>'',
// 'rename'=>false
// ),
// 'UPLOAD_QINIU_CONFIG'=>array(
// 'accessKey'=>'__ODsglZwwjRJNZHAu7vtcEf-zgIxdQAY-QqVrZD',
// 'secrectKey'=>'Z9-RahGtXhKeTUYy9WCnLbQ98ZuZ_paiaoBjByKv',
// 'bucket'=>'onethinktest',
// 'domain'=>'onethinktest.u.qiniudn.com',
// 'timeout'=>3600,
// ),
'UPLOAD_ALIYUN_CONFIG'=>array(
'AccessKeyId' => OSS_AccessKeyId, //OSS用户
'AccessKeySecret' => OSS_AccessKeySecret, //OSS密码
'domain' => OSS, //OSS空间路径
'Bucket' => OSS_Bucket, //空间名称
'Endpoint' => OSS_Endpoint,
'timeout'=> OSS_timeout,
),
'UPLOAD_TYPE_CONFIG'=>array(
'AccessKeyId' => OSS_AccessKeyId, //OSS用户
'AccessKeySecret' => OSS_AccessKeySecret, //OSS密码
'domain' => OSS, //OSS空间路径
'Bucket' => OSS_Bucket, //空间名称
'Endpoint' => OSS_Endpoint,
'timeout'=> OSS_timeout,
),
/* 编辑器图片上传相关配置 */
'EDITOR_UPLOAD' => array(
'mimes' => '', //允许上传的文件MiMe类型
'maxSize' => 50*1024*1024, //上传的文件大小限制 (0-不做限制)
'exts' => 'jpg,gif,png,jpeg,gif', //允许上传的文件后缀
'autoSub' => true, //自动子目录保存文件
'subName' => array('date', 'Y-m-d'), //子目录创建方式,[0]-函数名,[1]-参数,多个参数使用数组
'rootPath' => OSS, //保存根路径
'savePath' => '', //保存路径
'saveName' => array('uniqid', ''), //上传文件命名规则,[0]-函数名,[1]-参数,多个参数使用数组
'saveExt' => '', //文件保存后缀,空则使用原后缀
'replace' => false, //存在同名是否覆盖
'hash' => true, //是否生成hash编码
'callback' => false, //检测文件是否存在回调函数,如果存在返回文件信息数组
),
3、解决图片同一张只能上传一次的问题:
/Application/Admin/Model/下注释掉FileModel和PictureModel的removeTrash方法和调用removeTrash方法的代码:
// $setting['removeTrash'] = array($this, 'removeTrash');
// /**
// * 清除数据库存在但本地不存在的数据
// * @param $data
// */
// public function removeTrash($data){
// $this->where(array('id'=>$data['id'],))->delete();
// }
4、解决图片上传成功后,模板不显示图片的问题
编辑/Application/Admin/Controller/FileController.class.php,找到这一行:
$return['data'] = think_encrypt(json_encode($info['download']));
将其改为:
$return['data'] = $info['download']['id'];
解释下:因为在完成上传的时候,在前端的edit模板里,取的是data.id,但是在后台的upload方法里,返回的是加密过的一串长字符,这是由于upload方法的返回数据不是id造成的(该id是onethink_file表的id)
5、编辑/Application/Addons/EditorForAdmin/Controller/UploadController.class.php
这一步是为了让后台的编辑器支持文件上传和图片上传
可以通过下载第一步,给出的UploadController.class.php,也可以直接复制下面的代码:
// +----------------------------------------------------------------------
namespace AddonsEditorForAdminController;
use HomeControllerAddonsController;
use ThinkUpload;
class UploadController extends AddonsController {
public $uploader = null;
/* 上传图片 */
public function upload() {
/* 上传配置 */
$setting = C ( 'EDITOR_UPLOAD' );
$setting ['callback'] = array (
$this,
'isFile'
);
/* 调用文件上传组件上传文件 */
$pic_driver = C('PICTURE_UPLOAD_DRIVER');
$this->uploader = new Upload($setting, C('PICTURE_UPLOAD_DRIVER'),C("UPLOAD_{$pic_driver}_CONFIG"));
//$this->uploader = new Upload ( $setting, 'Local' );
$info = $this->uploader->upload ( $_FILES );
if ($info) {
$dao = D ( 'Picture', 'Home' );
foreach ( $info as &$file ) {
$file ['rootpath'] = __ROOT__ . ltrim ( $setting ['rootPath'], "." );
/* 已经存在文件记录 */
if (isset ( $file ['id'] ) && is_numeric ( $file ['id'] )) {
continue;
}
/* 记录文件信息 */
$file ['path'] = substr ( $setting ['rootPath'], 1 ) . $file ['savepath'] . $file ['savename'];
$file ['status'] = 1;
$file ['create_time'] = NOW_TIME;
if ($dao->create ( $file ) && ($id = $dao->add ())) {
$file ['id'] = $id;
}
}
}
return $info;
}
// keditor编辑器上传图片处理
public function ke_upimg() {
/* 返回标准数据 */
$return = array (
'error' => 0,
'info' => '上传成功',
'data' => ''
);
$info = $this->upload ();
$img = $info ['imgFile'] ['rootpath'] . $info ['imgFile'] ['savepath'] . $info ['imgFile'] ['savename'];
/* 记录附件信息 */
if ($img) {
$return ['id'] = $info ['imgFile'] ['id'];
$return ['url'] = $img;
unset ( $return ['info'], $return ['data'] );
} else {
$return ['error'] = 1;
$return ['message'] = $this->uploader->getError ();
}
/* 返回JSON数据 */
exit ( json_encode ( $return ) );
}
// ueditor编辑器上传图片处理
public function ue_upimg() {
$info = $this->upload ();
$pic_driver = C('EDITOR_UPLOAD_DRIVER');
if (strtolower($pic_driver) == 'local') {
$img = $info ['imgFile'] ['path'];
} else {
$img = $info ['imgFile']['url'];
}
$return = array ();
$return ['id'] = $info ['imgFile'] ['id'];
$return ['url'] = $img;
$title = htmlspecialchars ( $_POST ['pictitle'], ENT_QUOTES );
$return ['title'] = $title;
$return ['original'] = $info ['imgFile'] ['name'];
$return ['state'] = ($img) ? 'SUCCESS' : $this->uploader->getError ();
/* 返回JSON数据 */
$this->ajaxReturn ( $return );
}
// ueditor编辑器在线管理处理
// 扫描目录下(包括子文件夹)的图片并返回
public function ue_mgimg() {
$setting = C ( 'EDITOR_UPLOAD' );
$imgRootPath = $setting ['rootPath'];
$paths = array ('');
$files = array ();
$files = $this->getfiles ( $imgRootPath );
if (! count ( $files ))
return;
rsort ( $files, SORT_STRING );
$str = implode ( '|', $files );
echo $str;
}
/**
* 遍历获取目录下的指定类型的文件
*
* @param
* $path
* @param array $files
* @return array
*/
function getfiles($path, &$files = array()) {
if (! is_dir ( $path ))
return null;
$handle = opendir ( $path );
while ( false !== ($file = readdir ( $handle )) ) {
if ($file != '.' && $file != '..') {
$path2 = $path . '/' . $file;
if (is_dir ( $path2 )) {
$this->getfiles ( $path2, $files );
} else {
if (preg_match ( "/.(gif|jpeg|jpg|png|bmp)$/i", $file )) {
// $files[] = '/dev/'.$path2;
$files [] = __ROOT__ . '/' . ltrim ( ltrim ( $path2, '.' ), '/' );
}
}
}
}
return $files;
}
/**
* 检测当前上传的文件是否已经存在
*
* @param array $file
* 文件上传数组
* @return boolean 文件信息, false - 不存在该文件
*/
public function isFile($file) {
if (empty ( $file ['md5'] )) {
throw new Exception ( '缺少参数:md5' );
}
/* 查找文件 */
$map = array (
'md5' => $file ['md5'],
'sha1' => $file ['sha1']
);
return M ( 'Picture' )->field ( true )->where ( $map )->find ();
}
}
OK,到此结束,后台上传的文件和图片,即保存在OSS服务器上了~~这些文件和图片的信息,保存在onethink_file和onethink_picture表中,在前端页面调用图片和文件就从这俩模型里调出即可
这些配置的研究花了不少时间,希望能帮到你~~
发表评论 取消回复