热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

sae中配置weiphp,修复图片上传问题

首先在Storage中新建domin:uploads;然后修改以下文件1、Sae.class.php中修改为:**保存指定文件*@param
首先在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代码 
  1.   /* 图片上传相关配置 */
  2.   'PICTURE_UPLOAD' => array(
  3.     'mimes'  => ''//允许上传的文件MiMe类型
  4.     'maxSize'  => 2*1024*1024, //上传的文件大小限制 (0-不做限制)
  5.     'exts'  => 'jpg,gif,png,jpeg'//允许上传的文件后缀
  6.     'autoSub'  => true, //自动子目录保存文件
  7.     'subName'  => array('date''Y-m-d'), //子目录创建方式,[0]-函数名,[1]-参数,多个参数使用数组
  8.     'rootPath' => './Uploads/Picture/'//保存根路径
  9.     'savePath' => ''//保存路径
  10.     'saveName' => array('uniqid'''), //上传文件命名规则,[0]-函数名,[1]-参数,多个参数使用数组
  11.     'saveExt'  => ''//文件保存后缀,空则使用原后缀
  12.     'replace'  => false, //存在同名是否覆盖
  13.     'hash'  => true, //是否生成hash编码
  14.     'callback' => false, //检测文件是否存在回调函数,如果存在返回文件信息数组
  15.   ), //图片上传相关配置(文件上传类配置)
  16.   //  'PICTURE_UPLOAD_DRIVER'=>'local',  
  17.   'PICTURE_UPLOAD_DRIVER'=>'Sae',
  18.   //SAE上传文件驱动配置
  19.   'UPLOAD_SAE_CONFIG'=>array(
  20.     'rootPath'=>'http://' . $_SERVER['HTTP_APPNAME'] . '-uploads.stor.sinaapp.com/Editor/',
  21.   'domain'=>'uploads',
  22. ),
  23.   
  24.   //本地上传文件驱动配置
  25.   'UPLOAD_LOCAL_CONFIG'=>array(),
  26.   'UPLOAD_BCS_CONFIG'=>array(
  27.     'AccessKey'=>'',
  28.     'SecretKey'=>'',
  29.     'bucket'=>'',
  30.     'rename'=>false
  31.   ),

3、/Application/Home/Conf/config.php 修改为:
  1. return array(
  2.     // 预先加载的标签库
  3.     'TAGLIB_PRE_LOAD'     =>    'OT\\TagLib\\Article,OT\\TagLib\\Think',
  4.         
  5.     /* 主题设置 */
  6.     'DEFAULT_THEME' =>  'default',  // 默认模板主题名称

  7.     /* SESSION 和 COOKIE 配置 */
  8.     'SESSION_PREFIX' => 'weiphp_home', //session前缀
  9.     'COOKIE_PREFIX'  => 'weiphp_home_', // COOKIE前缀 避免冲突

  10.     /**
  11.      * 附件相关配置
  12.      * 附件是规划在插件中的,所以附件的配置暂时写到这里
  13.      * 后期会移动到数据库进行管理
  14.      */
  15.     'ATTACHMENT_DEFAULT' => array(
  16.         'is_upload'     => true,
  17.         'allow_type'    => '0,1,2', //允许的附件类型 (0-目录,1-外链,2-文件)
  18.         'driver'        => 'Sae', //上传驱动
  19.         'driver_config' => null, //驱动配置
  20.     ), //附件默认配置

  21.     'ATTACHMENT_UPLOAD' => array(
  22.         'mimes'    => '', //允许上传的文件MiMe类型
  23.         'maxSize'  => 5*1024*1024, //上传的文件大小限制 (0-不做限制)
  24.         'exts'     => 'jpg,gif,png,jpeg,zip,rar,tar,gz,7z,doc,docx,txt,xml', //允许上传的文件后缀
  25.         'autoSub'  => true, //自动子目录保存文件
  26.         'subName'  => array('date', 'Y-m-d'), //子目录创建方式,[0]-函数名,[1]-参数,多个参数使用数组
  27.         'rootPath' => './Uploads/Attachment/', //保存根路径
  28.         'savePath' => '', //保存路径
  29.         'saveName' => array('uniqid', ''), //上传文件命名规则,[0]-函数名,[1]-参数,多个参数使用数组
  30.         'saveExt'  => '', //文件保存后缀,空则使用原后缀
  31.         'replace'  => false, //存在同名是否覆盖
  32.         'hash'     => true, //是否生成hash编码
  33.         'callback' => false, //检测文件是否存在回调函数,如果存在返回文件信息数组
  34.     ), //附件上传配置(文件上传类配置)
  35.     /* 模板相关配置 */
  36.     'TMPL_PARSE_STRING' => array(
  37.         '__STATIC__' => __ROOT__ . '/Public/static',
  38.         '__ADDONS__' => __ROOT__ . '/Public/' . MODULE_NAME . '/Addons',
  39.         '__IMG__'    => __ROOT__ . '/Public/' . MODULE_NAME . '/images',
  40.         '__CSS__'    => __ROOT__ . '/Public/' . MODULE_NAME . '/css',
  41.         '__JS__'     => __ROOT__ . '/Public/' . MODULE_NAME . '/js',
  42.     ),
  43.     /* 数据缓存设置 */
  44.     'DATA_CACHE_PREFIX'    => 'weiphp_', // 缓存前缀
  45.     'DATA_CACHE_TYPE'      => 'File', // 数据缓存类型
  46.     
  47.     /* 文件上传相关配置 */
  48.     'DOWNLOAD_UPLOAD' => array(
  49.         'mimes'    => '', //允许上传的文件MiMe类型
  50.         'maxSize'  => 5*1024*1024, //上传的文件大小限制 (0-不做限制)
  51.         'exts'     => 'jpg,gif,png,jpeg,zip,rar,tar,gz,7z,doc,docx,txt,xml', //允许上传的文件后缀
  52.         'autoSub'  => true, //自动子目录保存文件
  53.         'subName'  => array('date', 'Y-m-d'), //子目录创建方式,[0]-函数名,[1]-参数,多个参数使用数组
  54.         'rootPath' => './Uploads/Download/', //保存根路径
  55.         'savePath' => '', //保存路径
  56.         'saveName' => array('uniqid', ''), //上传文件命名规则,[0]-函数名,[1]-参数,多个参数使用数组
  57.         'saveExt'  => '', //文件保存后缀,空则使用原后缀
  58.         'replace'  => false, //存在同名是否覆盖
  59.         'hash'     => true, //是否生成hash编码
  60.         'callback' => false, //检测文件是否存在回调函数,如果存在返回文件信息数组
  61.     ), //下载模型上传配置(文件上传类配置)    
  62.     
  63.     /* 图片上传相关配置 */
  64.     'PICTURE_UPLOAD' => array(
  65.         'mimes'    => '', //允许上传的文件MiMe类型
  66.         'maxSize'  => 2*1024*1024, //上传的文件大小限制 (0-不做限制)
  67.         'exts'     => 'jpg,gif,png,jpeg', //允许上传的文件后缀
  68.         'autoSub'  => true, //自动子目录保存文件
  69.         'subName'  => array('date', 'Y-m-d'), //子目录创建方式,[0]-函数名,[1]-参数,多个参数使用数组
  70.         'rootPath' => './Uploads/Picture/', //保存根路径
  71.         'savePath' => '', //保存路径
  72.         'saveName' => array('uniqid', ''), //上传文件命名规则,[0]-函数名,[1]-参数,多个参数使用数组
  73.         'saveExt'  => '', //文件保存后缀,空则使用原后缀
  74.         'replace'  => false, //存在同名是否覆盖
  75.         'hash'     => true, //是否生成hash编码
  76.         'callback' => false, //检测文件是否存在回调函数,如果存在返回文件信息数组
  77.     ), //图片上传相关配置(文件上传类配置)

  78.     'PICTURE_UPLOAD_DRIVER'=>'Sae',    
  79.     
  80.     //本地上传文件驱动配置
  81.     'UPLOAD_LOCAL_CONFIG'=>array(),
  82.     'UPLOAD_BCS_CONFIG'=>array(
  83.         'AccessKey'=>'',
  84.         'SecretKey'=>'',
  85.         'bucket'=>'',
  86.         'rename'=>false
  87.     ),
  88.     'UPLOAD_QINIU_CONFIG'=>array(
  89.         'accessKey'=>'__ODsglZwwjRJNZHAu7vtcEf-zgIxdQAY-QqVrZD',
  90.         'secrectKey'=>'Z9-RahGtXhKeTUYy9WCnLbQ98ZuZ_paiaoBjByKv',
  91.         'bucket'=>'onethinktest',
  92.         'domain'=>'onethinktest.u.qiniudn.com',
  93.         'timeout'=>3600,
  94.     ),

  95.     /* 编辑器图片上传相关配置 */
  96.     'EDITOR_UPLOAD' => array(
  97.         'mimes'    => '', //允许上传的文件MiMe类型
  98.         'maxSize'  => 2*1024*1024, //上传的文件大小限制 (0-不做限制)
  99.         'exts'     => 'jpg,gif,png,jpeg', //允许上传的文件后缀
  100.         'autoSub'  => true, //自动子目录保存文件
  101.         'subName'  => array('date', 'Y-m-d'), //子目录创建方式,[0]-函数名,[1]-参数,多个参数使用数组
  102.         'rootPath' => './Uploads/Editor/', //保存根路径
  103.         'savePath' => '', //保存路径
  104.         'saveName' => array('uniqid', ''), //上传文件命名规则,[0]-函数名,[1]-参数,多个参数使用数组
  105.         'saveExt'  => '', //文件保存后缀,空则使用原后缀
  106.         'replace'  => false, //存在同名是否覆盖
  107.         'hash'     => true, //是否生成hash编码
  108.         'callback' => false, //检测文件是否存在回调函数,如果存在返回文件信息数组
  109.     ),        
  110. );
4、图片保存的位置 Application\Home\Model\PictureModel.class.php 修改为:
  1. namespace Home\Model;
  2. use Think\Model;
  3. use Think\Upload;

  4. /**
  5. * 图片模型
  6. * 负责图片的上传
  7. */

  8. class PictureModel extends Model{
  9.     /**
  10.      * 自动完成
  11.      * @var array
  12.      */
  13.     protected $_auto = array(
  14.         array('status', 1, self::MODEL_INSERT),
  15.         array('create_time', NOW_TIME, self::MODEL_INSERT),
  16.     );

  17.     /**
  18.      * 文件上传
  19.      * @param  array  $files   要上传的文件列表(通常是$_FILES数组)
  20.      * @param  array  $setting 文件上传配置
  21.      * @param  string $driver  上传驱动名称
  22.      * @param  array  $config  上传驱动配置
  23.      * @return array           文件上传成功后的信息
  24.      */
  25.     public function upload($files, $setting, $driver = 'Local', $cOnfig= null){
  26.         /* 上传文件 */
  27.         $setting['callback'] = array($this, 'isFile');
  28.         $setting['removeTrash'] = array($this, 'removeTrash');
  29.         $Upload = new Upload($setting, $driver, $config);
  30.         $info   = $Upload->upload($files);

  31.         if($info){ //文件上传成功,记录文件信息
  32.             foreach ($info as $key => &$value) {
  33.                 /* 已经存在文件记录 */
  34.                 if(isset($value['id']) && is_numeric($value['id'])){
  35.                     continue;
  36.                 }

  37.                 /* 记录文件信息 */
  38.                 if (strtolower($driver) == "sae") {
  39.                     $value['path'] = $value['url'];
  40.                 } else {
  41.                     $value['path'] = substr($setting['rootPath'], 1).$value['savepath'].$value['savename'];    //在模板里的url路径
  42.                 }
  43.                 if($this->create($value) && ($id = $this->add())){
  44.                     $value['id'] = $id;
  45.                 } else {
  46.                     //TODO: 文件上传成功,但是记录文件信息失败,需记录日志
  47.                     unset($info[$key]);
  48.                 }
  49.             }
  50.             return $info; //文件上传成功
  51.         } else {
  52.             $this->error = $Upload->getError();
  53.             return false;
  54.         }
  55.     }

  56.     /**
  57.      * 下载指定文件
  58.      * @param  number  $root 文件存储根目录
  59.      * @param  integer $id   文件ID
  60.      * @param  string   $args     回调函数参数
  61.      * @return boolean       false-下载失败,否则输出下载文件
  62.      */
  63.     public function download($root, $id, $callback = null, $args = null){
  64.         /* 获取下载文件信息 */
  65.         $file = $this->find($id);
  66.         if(!$file){
  67.             $this->error = '不存在该文件!';
  68.             return false;
  69.         }

  70.         /* 下载文件 */
  71.         switch ($file['location']) {
  72.             case 0: //下载本地文件
  73.                 $file['rootpath'] = $root;
  74.                 return $this->downLocalFile($file, $callback, $args);
  75.             case 1: //TODO: 下载远程FTP文件
  76.                 break;
  77.             default:
  78.                 $this->error = '不支持的文件存储类型!';
  79.                 return false;

  80.         }

  81.     }

  82.     /**
  83.      * 检测当前上传的文件是否已经存在
  84.      * @param  array   $file 文件上传数组
  85.      * @return boolean       文件信息, false - 不存在该文件
  86.      */
  87.     public function isFile($file){
  88.         if(empty($file['md5'])){
  89.             throw new \Exception('缺少参数:md5');
  90.         }
  91.         /* 查找文件 */
  92.         $map = array('md5' => $file['md5'],'sha1'=>$file['sha1'],);
  93.         return $this->field(true)->where($map)->find();
  94.     }

  95.     /**
  96.      * 下载本地文件
  97.      * @param  array    $file     文件信息数组
  98.      * @param  callable $callback 下载回调函数,一般用于增加下载次数
  99.      * @param  string   $args     回调函数参数
  100.      * @return boolean            下载失败返回false
  101.      */
  102.     private function downLocalFile($file, $callback = null, $args = null){
  103.         if(is_file($file['rootpath'].$file['savepath'].$file['savename'])){
  104.             /* 调用回调函数新增下载数 */
  105.             is_callable($callback) && call_user_func($callback, $args);

  106.             /* 执行下载 */ //TODO: 大文件断点续传
  107.             header("Content-Description: File Transfer");
  108.             header('Content-type: ' . $file['type']);
  109.             header('Content-Length:' . $file['size']);
  110.             if (preg_match('/MSIE/', $_SERVER['HTTP_USER_AGENT'])) { //for IE
  111.                 header('Content-Disposition: attachment; filename="' . rawurlencode($file['name']) . '"');
  112.             } else {
  113.                 header('Content-Disposition: attachment; filename="' . $file['name'] . '"');
  114.             }
  115.             readfile($file['rootpath'].$file['savepath'].$file['savename']);
  116.             exit;
  117.         } else {
  118.             $this->error = '文件已被删除!';
  119.             return false;
  120.         }
  121.     }

  122.     /**
  123.      * 清除数据库存在但本地不存在的数据
  124.      * @param $data
  125.      */
  126.     public function removeTrash($data){
  127.         $this->where(array('id'=>$data['id'],))->delete();
  128.     }

  129. }

5、图片取得的函数
Application\Common\Common\function.php x修改为:
  1. function get_cover_url($cover_id) {
  2.     if (empty ( $cover_id )) {
  3.         return '';
  4.     }

  5.     // modify by xiahy, 2014/04/11,将图片存在SAE的stor中,所以保存的是完整路径
  6.     // return SITE_URL . get_cover ( $cover_id, 'path' );
  7.     $coverPath = get_cover ( $cover_id, 'path' );
  8.     if (strstr($coverPath, 'http://') or  strstr($coverPath, 'https://')) {
  9.         return $coverPath;
  10.     } else {
  11.         return SITE_URL . $coverPath;
  12.     }
  13. }

6、修改: /Addons/EditorForAdmin/Controller/UploadController.class.php
修改: Local 为 Sae
修改: EDITOR_UPLOAD 为 UPLOAD_SAE_CONFIG


ps:

Sae.class.php 这个文件在哪

QQ截图20141030164647.png 



推荐阅读
  • 本文介绍了使用FormData对象上传文件同时附带其他参数的方法。通过创建一个表单,将文件和参数添加到FormData对象中,然后使用ajax发送POST请求进行文件上传。在发送请求时,需要设置processData为false,告诉jquery不要处理发送的数据;同时设置contentType为false,告诉jquery不要设置content-Type请求头。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • 图像因存在错误而无法显示 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • 本文讨论了如何使用Web.Config进行自定义配置节的配置转换。作者提到,他将msbuild设置为详细模式,但转换却忽略了带有替换转换的自定义部分的存在。 ... [详细]
  • 小程序wxs中的时间格式化以及格式化时间和date时间互转
    本文介绍了在小程序wxs中进行时间格式化操作的问题,并提供了解决方法。同时还介绍了格式化时间和date时间的互相转换的方法。 ... [详细]
  • JavaScript和HTML之间的交互是经由过程事宜完成的。事宜:文档或浏览器窗口中发作的一些特定的交互霎时。能够运用侦听器(或处置惩罚递次来预订事宜),以便事宜发作时实行相应的 ... [详细]
  • AFNetwork框架(零)使用NSURLSession进行网络请求
    本文介绍了AFNetwork框架中使用NSURLSession进行网络请求的方法,包括NSURLSession的配置、请求的创建和执行等步骤。同时还介绍了NSURLSessionDelegate和NSURLSessionConfiguration的相关内容。通过本文可以了解到AFNetwork框架中使用NSURLSession进行网络请求的基本流程和注意事项。 ... [详细]
  • 本文总结了在编写JS代码时,不同浏览器间的兼容性差异,并提供了相应的解决方法。其中包括阻止默认事件的代码示例和猎取兄弟节点的函数。这些方法可以帮助开发者在不同浏览器上实现一致的功能。 ... [详细]
  • 本文介绍了使用readlink命令获取文件的完整路径的简单方法,并提供了一个示例命令来打印文件的完整路径。共有28种解决方案可供选择。 ... [详细]
  • 初探PLC 的ST 语言转换成C++ 的方法
    自动控制软件绕不开ST(StructureText)语言。它是IEC61131-3标准中唯一的一个高级语言。目前,大多数PLC产品支持ST ... [详细]
  • 【爬虫】关于企业信用信息公示系统加速乐最新反爬虫机制
    ( ̄▽ ̄)~又得半夜修仙了,作为一个爬虫小白,花了3天时间写好的程序,才跑了一个月目标网站就更新了,是有点悲催,还是要只有一天的时间重构。升级后网站的层次结构并没有太多变化,表面上 ... [详细]
  • 使用这个技巧要达到的目标:一般来说,模型和控制器你都不会有相同的类名字。让我先创建一个取名为post的model。classPostextendsModel{}现在 ... [详细]
  • Ihavebeenworkingwithbufferingafileonmylocaldrivetoparseandobtaincertaindata.Forte ... [详细]
  • PLSQL块:PLSQL块都用于解决特定问题,PLSQL块可以有参数,也可以相互调用。PLSQL块可以作为模式对象在Oracle数据库中保存,根据用途可以 ... [详细]
author-avatar
极神bd韵
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有