sae中配置weiphp,修复图片上传问题
2015-11-01 16:15
627 查看
首先在Storage中新建domin:uploads;
然后修改以下文件
1、Sae.class.php 中修改为:
/** 保存指定文件
* @param array $file 保存的文件信息
* @param boolean $replace 同名文件是否覆盖
* @return boolean 保存状态,true-成功,false-失败
*/
public function save(&$file,
$replace=true) {
$filename = ltrim($this->rootPath .'/'.
$file['savepath'] . $file['savename'],'/');
$st=new \SaeStorage();
/* 不覆盖同名文件 */
if (!$replace && $st->fileExists($this->domain,$filename))
{
$this->error = '存在同名文件' .
$file['savename'];
return false;
}
/* 移动文件 */
$url = $st->upload($this->domain,$filename,$file['tmp_name']);
if (!$url) {
$this->error = '文件上传保存错误!['.$st->errno().']:'.$st->errmsg();
return false;
} else {
$file['url'] = $url;
$file['download'] = $url;
}
return true;
}
4、图片保存的位置 Application\Home\Model\PictureModel.class.php 修改为:
namespace Home\Model;
use Think\Model;
use Think\Upload;
/**
* 图片模型
* 负责图片的上传
*/
class PictureModel extends Model{
/**
* 自动完成
* @var array
*/
protected $_auto = array(
array('status', 1, self::MODEL_INSERT),
array('create_time', NOW_TIME, self::MODEL_INSERT),
);
/**
* 文件上传
* @param array $files 要上传的文件列表(通常是$_FILES数组)
* @param array $setting 文件上传配置
* @param string $driver 上传驱动名称
* @param array $config 上传驱动配置
* @return array 文件上传成功后的信息
*/
public function upload($files, $setting, $driver = 'Local', $config = null){
/* 上传文件 */
$setting['callback'] = array($this, 'isFile');
$setting['removeTrash'] = array($this, 'removeTrash');
$Upload = new Upload($setting, $driver, $config);
$info = $Upload->upload($files);
if($info){ //文件上传成功,记录文件信息
foreach ($info as $key => &$value) {
/* 已经存在文件记录 */
if(isset($value['id']) && is_numeric($value['id'])){
continue;
}
/* 记录文件信息 */
if (strtolower($driver) == "sae") {
$value['path'] = $value['url'];
} else {
$value['path'] = substr($setting['rootPath'], 1).$value['savepath'].$value['savename']; //在模板里的url路径
}
if($this->create($value) && ($id = $this->add())){
$value['id'] = $id;
} else {
//TODO: 文件上传成功,但是记录文件信息失败,需记录日志
unset($info[$key]);
}
}
return $info; //文件上传成功
} else {
$this->error = $Upload->getError();
return false;
}
}
/**
* 下载指定文件
* @param number $root 文件存储根目录
* @param integer $id 文件ID
* @param string $args 回调函数参数
* @return boolean false-下载失败,否则输出下载文件
*/
public function download($root, $id, $callback = null, $args = null){
/* 获取下载文件信息 */
$file = $this->find($id);
if(!$file){
$this->error = '不存在该文件!';
return false;
}
/* 下载文件 */
switch ($file['location']) {
case 0: //下载本地文件
$file['rootpath'] = $root;
return $this->downLocalFile($file, $callback, $args);
case 1: //TODO: 下载远程FTP文件
break;
default:
$this->error = '不支持的文件存储类型!';
return false;
}
}
/**
* 检测当前上传的文件是否已经存在
* @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 $this->field(true)->where($map)->find();
}
/**
* 下载本地文件
* @param array $file 文件信息数组
* @param callable $callback 下载回调函数,一般用于增加下载次数
* @param string $args 回调函数参数
* @return boolean 下载失败返回false
*/
private function downLocalFile($file, $callback = null, $args = null){
if(is_file($file['rootpath'].$file['savepath'].$file['savename'])){
/* 调用回调函数新增下载数 */
is_callable($callback) && call_user_func($callback, $args);
/* 执行下载 */ //TODO: 大文件断点续传
header("Content-Description: File Transfer");
header('Content-type: ' . $file['type']);
header('Content-Length:' . $file['size']);
if (preg_match('/MSIE/', $_SERVER['HTTP_USER_AGENT'])) { //for IE
header('Content-Disposition: attachment; filename="' . rawurlencode($file['name']) . '"');
} else {
header('Content-Disposition: attachment; filename="' . $file['name'] . '"');
}
readfile($file['rootpath'].$file['savepath'].$file['savename']);
exit;
} else {
$this->error = '文件已被删除!';
return false;
}
}
/**
* 清除数据库存在但本地不存在的数据
* @param $data
*/
public function removeTrash($data){
$this->where(array('id'=>$data['id'],))->delete();
}
}
6、修改: /Addons/EditorForAdmin/Controller/UploadController.class.php
修改: Local 为 Sae
修改: EDITOR_UPLOAD 为 UPLOAD_SAE_CONFIG
ps:
Sae.class.php
这个文件在哪
然后修改以下文件
1、Sae.class.php 中修改为:
/** 保存指定文件
* @param array $file 保存的文件信息
* @param boolean $replace 同名文件是否覆盖
* @return boolean 保存状态,true-成功,false-失败
*/
public function save(&$file,
$replace=true) {
$filename = ltrim($this->rootPath .'/'.
$file['savepath'] . $file['savename'],'/');
$st=new \SaeStorage();
/* 不覆盖同名文件 */
if (!$replace && $st->fileExists($this->domain,$filename))
{
$this->error = '存在同名文件' .
$file['savename'];
return false;
}
/* 移动文件 */
$url = $st->upload($this->domain,$filename,$file['tmp_name']);
if (!$url) {
$this->error = '文件上传保存错误!['.$st->errno().']:'.$st->errmsg();
return false;
} else {
$file['url'] = $url;
$file['download'] = $url;
}
return true;
}
2、/Application/Admin/Conf/config.php 修改为: PHP代码 /* 图片上传相关配置 */ 'PICTURE_UPLOAD' => array( 'mimes' => '', //允许上传的文件MiMe类型 'maxSize' => 2*1024*1024, //上传的文件大小限制 (0-不做限制) 'exts' => 'jpg,gif,png,jpeg', //允许上传的文件后缀 'autoSub' => true, //自动子目录保存文件 'subName' => array('date', 'Y-m-d'), //子目录创建方式,[0]-函数名,[1]-参数,多个参数使用数组 'rootPath' => './Uploads/Picture/', //保存根路径 'savePath' => '', //保存路径 'saveName' => array('uniqid', ''), //上传文件命名规则,[0]-函数名,[1]-参数,多个参数使用数组 'saveExt' => '', //文件保存后缀,空则使用原后缀 'replace' => false, //存在同名是否覆盖 'hash' => true, //是否生成hash编码 'callback' => false, //检测文件是否存在回调函数,如果存在返回文件信息数组 ), //图片上传相关配置(文件上传类配置) // 'PICTURE_UPLOAD_DRIVER'=>'local', 'PICTURE_UPLOAD_DRIVER'=>'Sae', //SAE上传文件驱动配置 'UPLOAD_SAE_CONFIG'=>array( 'rootPath'=>'http://' . $_SERVER['HTTP_APPNAME'] . '-uploads.stor.sinaapp.com/Editor/', 'domain'=>'uploads', ), //本地上传文件驱动配置 'UPLOAD_LOCAL_CONFIG'=>array(), 'UPLOAD_BCS_CONFIG'=>array( 'AccessKey'=>'', 'SecretKey'=>'', 'bucket'=>'', 'rename'=>false ), |
3、/Application/Home/Conf/config.php 修改为: return array( // 预先加载的标签库 'TAGLIB_PRE_LOAD' => 'OT\\TagLib\\Article,OT\\TagLib\\Think', /* 主题设置 */ 'DEFAULT_THEME' => 'default', // 默认模板主题名称 /* SESSION 和 COOKIE 配置 */ 'SESSION_PREFIX' => 'weiphp_home', //session前缀 'COOKIE_PREFIX' => 'weiphp_home_', // Cookie前缀 避免冲突 /** * 附件相关配置 * 附件是规划在插件中的,所以附件的配置暂时写到这里 * 后期会移动到数据库进行管理 */ 'ATTACHMENT_DEFAULT' => array( 'is_upload' => true, 'allow_type' => '0,1,2', //允许的附件类型 (0-目录,1-外链,2-文件) 'driver' => 'Sae', //上传驱动 'driver_config' => null, //驱动配置 ), //附件默认配置 'ATTACHMENT_UPLOAD' => array( 'mimes' => '', //允许上传的文件MiMe类型 'maxSize' => 5*1024*1024, //上传的文件大小限制 (0-不做限制) 'exts' => 'jpg,gif,png,jpeg,zip,rar,tar,gz,7z,doc,docx,txt,xml', //允许上传的文件后缀 'autoSub' => true, //自动子目录保存文件 'subName' => array('date', 'Y-m-d'), //子目录创建方式,[0]-函数名,[1]-参数,多个参数使用数组 'rootPath' => './Uploads/Attachment/', //保存根路径 'savePath' => '', //保存路径 'saveName' => array('uniqid', ''), //上传文件命名规则,[0]-函数名,[1]-参数,多个参数使用数组 'saveExt' => '', //文件保存后缀,空则使用原后缀 'replace' => false, //存在同名是否覆盖 'hash' => true, //是否生成hash编码 'callback' => false, //检测文件是否存在回调函数,如果存在返回文件信息数组 ), //附件上传配置(文件上传类配置) /* 模板相关配置 */ 'TMPL_PARSE_STRING' => array( '__STATIC__' => __ROOT__ . '/Public/static', '__ADDONS__' => __ROOT__ . '/Public/' . MODULE_NAME . '/Addons', '__IMG__' => __ROOT__ . '/Public/' . MODULE_NAME . '/images', '__CSS__' => __ROOT__ . '/Public/' . MODULE_NAME . '/css', '__JS__' => __ROOT__ . '/Public/' . MODULE_NAME . '/js', ), /* 数据缓存设置 */ 'DATA_CACHE_PREFIX' => 'weiphp_', // 缓存前缀 'DATA_CACHE_TYPE' => 'File', // 数据缓存类型 /* 文件上传相关配置 */ 'DOWNLOAD_UPLOAD' => array( 'mimes' => '', //允许上传的文件MiMe类型 'maxSize' => 5*1024*1024, //上传的文件大小限制 (0-不做限制) 'exts' => 'jpg,gif,png,jpeg,zip,rar,tar,gz,7z,doc,docx,txt,xml', //允许上传的文件后缀 'autoSub' => true, //自动子目录保存文件 'subName' => array('date', 'Y-m-d'), //子目录创建方式,[0]-函数名,[1]-参数,多个参数使用数组 'rootPath' => './Uploads/Download/', //保存根路径 'savePath' => '', //保存路径 'saveName' => array('uniqid', ''), //上传文件命名规则,[0]-函数名,[1]-参数,多个参数使用数组 'saveExt' => '', //文件保存后缀,空则使用原后缀 'replace' => false, //存在同名是否覆盖 'hash' => true, //是否生成hash编码 'callback' => false, //检测文件是否存在回调函数,如果存在返回文件信息数组 ), //下载模型上传配置(文件上传类配置) /* 图片上传相关配置 */ 'PICTURE_UPLOAD' => array( 'mimes' => '', //允许上传的文件MiMe类型 'maxSize' => 2*1024*1024, //上传的文件大小限制 (0-不做限制) 'exts' => 'jpg,gif,png,jpeg', //允许上传的文件后缀 'autoSub' => true, //自动子目录保存文件 'subName' => array('date', 'Y-m-d'), //子目录创建方式,[0]-函数名,[1]-参数,多个参数使用数组 'rootPath' => './Uploads/Picture/', //保存根路径 'savePath' => '', //保存路径 'saveName' => array('uniqid', ''), //上传文件命名规则,[0]-函数名,[1]-参数,多个参数使用数组 'saveExt' => '', //文件保存后缀,空则使用原后缀 'replace' => false, //存在同名是否覆盖 'hash' => true, //是否生成hash编码 'callback' => false, //检测文件是否存在回调函数,如果存在返回文件信息数组 ), //图片上传相关配置(文件上传类配置) 'PICTURE_UPLOAD_DRIVER'=>'Sae', //本地上传文件驱动配置 '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, ), /* 编辑器图片上传相关配置 */ 'EDITOR_UPLOAD' => array( 'mimes' => '', //允许上传的文件MiMe类型 'maxSize' => 2*1024*1024, //上传的文件大小限制 (0-不做限制) 'exts' => 'jpg,gif,png,jpeg', //允许上传的文件后缀 'autoSub' => true, //自动子目录保存文件 'subName' => array('date', 'Y-m-d'), //子目录创建方式,[0]-函数名,[1]-参数,多个参数使用数组 'rootPath' => './Uploads/Editor/', //保存根路径 'savePath' => '', //保存路径 'saveName' => array('uniqid', ''), //上传文件命名规则,[0]-函数名,[1]-参数,多个参数使用数组 'saveExt' => '', //文件保存后缀,空则使用原后缀 'replace' => false, //存在同名是否覆盖 'hash' => true, //是否生成hash编码 'callback' => false, //检测文件是否存在回调函数,如果存在返回文件信息数组 ), ); |
namespace Home\Model;
use Think\Model;
use Think\Upload;
/**
* 图片模型
* 负责图片的上传
*/
class PictureModel extends Model{
/**
* 自动完成
* @var array
*/
protected $_auto = array(
array('status', 1, self::MODEL_INSERT),
array('create_time', NOW_TIME, self::MODEL_INSERT),
);
/**
* 文件上传
* @param array $files 要上传的文件列表(通常是$_FILES数组)
* @param array $setting 文件上传配置
* @param string $driver 上传驱动名称
* @param array $config 上传驱动配置
* @return array 文件上传成功后的信息
*/
public function upload($files, $setting, $driver = 'Local', $config = null){
/* 上传文件 */
$setting['callback'] = array($this, 'isFile');
$setting['removeTrash'] = array($this, 'removeTrash');
$Upload = new Upload($setting, $driver, $config);
$info = $Upload->upload($files);
if($info){ //文件上传成功,记录文件信息
foreach ($info as $key => &$value) {
/* 已经存在文件记录 */
if(isset($value['id']) && is_numeric($value['id'])){
continue;
}
/* 记录文件信息 */
if (strtolower($driver) == "sae") {
$value['path'] = $value['url'];
} else {
$value['path'] = substr($setting['rootPath'], 1).$value['savepath'].$value['savename']; //在模板里的url路径
}
if($this->create($value) && ($id = $this->add())){
$value['id'] = $id;
} else {
//TODO: 文件上传成功,但是记录文件信息失败,需记录日志
unset($info[$key]);
}
}
return $info; //文件上传成功
} else {
$this->error = $Upload->getError();
return false;
}
}
/**
* 下载指定文件
* @param number $root 文件存储根目录
* @param integer $id 文件ID
* @param string $args 回调函数参数
* @return boolean false-下载失败,否则输出下载文件
*/
public function download($root, $id, $callback = null, $args = null){
/* 获取下载文件信息 */
$file = $this->find($id);
if(!$file){
$this->error = '不存在该文件!';
return false;
}
/* 下载文件 */
switch ($file['location']) {
case 0: //下载本地文件
$file['rootpath'] = $root;
return $this->downLocalFile($file, $callback, $args);
case 1: //TODO: 下载远程FTP文件
break;
default:
$this->error = '不支持的文件存储类型!';
return false;
}
}
/**
* 检测当前上传的文件是否已经存在
* @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 $this->field(true)->where($map)->find();
}
/**
* 下载本地文件
* @param array $file 文件信息数组
* @param callable $callback 下载回调函数,一般用于增加下载次数
* @param string $args 回调函数参数
* @return boolean 下载失败返回false
*/
private function downLocalFile($file, $callback = null, $args = null){
if(is_file($file['rootpath'].$file['savepath'].$file['savename'])){
/* 调用回调函数新增下载数 */
is_callable($callback) && call_user_func($callback, $args);
/* 执行下载 */ //TODO: 大文件断点续传
header("Content-Description: File Transfer");
header('Content-type: ' . $file['type']);
header('Content-Length:' . $file['size']);
if (preg_match('/MSIE/', $_SERVER['HTTP_USER_AGENT'])) { //for IE
header('Content-Disposition: attachment; filename="' . rawurlencode($file['name']) . '"');
} else {
header('Content-Disposition: attachment; filename="' . $file['name'] . '"');
}
readfile($file['rootpath'].$file['savepath'].$file['savename']);
exit;
} else {
$this->error = '文件已被删除!';
return false;
}
}
/**
* 清除数据库存在但本地不存在的数据
* @param $data
*/
public function removeTrash($data){
$this->where(array('id'=>$data['id'],))->delete();
}
}
5、图片取得的函数 Application\Common\Common\function.php x修改为: function get_cover_url($cover_id) { if (empty ( $cover_id )) { return ''; } // modify by xiahy, 2014/04/11,将图片存在SAE的stor中,所以保存的是完整路径 // return SITE_URL . get_cover ( $cover_id, 'path' ); $coverPath = get_cover ( $cover_id, 'path' ); if (strstr($coverPath, 'http://') or strstr($coverPath, 'https://')) { return $coverPath; } else { return SITE_URL . $coverPath; } } |
修改: Local 为 Sae
修改: EDITOR_UPLOAD 为 UPLOAD_SAE_CONFIG
ps:
Sae.class.php
这个文件在哪
相关文章推荐
- PHP命名空间解析规则
- 对于zendframework2的路由配置的说明
- API 参考 (SQL Server Driver for PHP)
- php输出查询数据转换成json
- 如何修改WAMP中mysql默认空密码&重新登录phpmyadmin
- PHP+Mysql+AJAX登录验证
- PHP+Mysql+AJAX无跳转刷新例子
- php学习之 array_merge与操作符+号的区别
- tp写一个微型论坛 (一)
- js模拟php的shuffle函数,用来打乱一维数组
- sftp与samba文件传输速度的对比
- ThinkPHP如何禁止直接通过路径访问
- 一个轻量级的c编写的php接口平台框架
- PHP常用函数备用
- thinkphp中data()的使用方法
- ThinkPHP中data()方法的使用
- ThinkPHP中数据库CRUD操作方法盘点(limit、page、table、order、data方法)
- S3C2416裸机开发系列二一_Yaffs的移植
- phpunit手动配置
- partprobe重新读取分区表