您的位置:首页 > 编程语言 > PHP开发

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;

}

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, //检测文件是否存在回调函数,如果存在返回文件信息数组

),

);

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();

}

}

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;

}

}

6、修改: /Addons/EditorForAdmin/Controller/UploadController.class.php

修改: Local 为 Sae

修改: EDITOR_UPLOAD 为 UPLOAD_SAE_CONFIG

ps:

Sae.class.php
这个文件在哪

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: