热门标签 | 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 



推荐阅读
  • 解决FCKeditor应用主题后上传问题及优化配置
    本文介绍了在Freetextbox收费后选择FCKeditor作为替代方案时遇到的上传问题及其解决方案。通过调整配置文件和调试工具,最终解决了上传失败的问题,并对相关配置进行了优化。 ... [详细]
  • PHP 过滤器详解
    本文深入探讨了 PHP 中的过滤器机制,包括常见的 $_SERVER 变量、filter_has_var() 函数、filter_id() 函数、filter_input() 函数及其数组形式、filter_list() 函数以及 filter_var() 和其数组形式。同时,详细介绍了各种过滤器的用途和用法。 ... [详细]
  • 在网站制作中随时可用的10个 HTML5 代码片段
    HTML很容易写,但创建网页时,您经常需要重复做同样的任务,如创建表单。在这篇文章中,我收集了10个超有用的HTML代码片段,有HTML5启动模板、空白图片、打电话和发短信、自动完 ... [详细]
  • 阿里云ecs怎么配置php环境,阿里云ecs配置选择 ... [详细]
  • Python处理Word文档的高效技巧
    本文详细介绍了如何使用Python处理Word文档,涵盖从基础操作到高级功能的各种技巧。我们将探讨如何生成文档、定义样式、提取表格数据以及处理超链接和图片等内容。 ... [详细]
  • 在本教程中,我们将深入探讨如何使用 Python 构建游戏的主程序模块。通过逐步实现各个关键组件,最终完成一个功能完善的游戏界面。 ... [详细]
  • 本文详细探讨了JavaScript中的作用域链和闭包机制,解释了它们的工作原理及其在实际编程中的应用。通过具体的代码示例,帮助读者更好地理解和掌握这些概念。 ... [详细]
  • 雨林木风 GHOST XP SP3 经典珍藏版 V2017.11
    雨林木风 GHOST XP SP3 经典珍藏版 V2017.11 ... [详细]
  • 中科院学位论文排版指南
    随着毕业季的到来,许多即将毕业的学生开始撰写学位论文。本文介绍了使用LaTeX排版学位论文的方法,特别是针对中国科学院大学研究生学位论文撰写规范指导意见的最新要求。LaTeX以其精确的控制和美观的排版效果成为许多学者的首选。 ... [详细]
  • Python 内存管理机制详解
    本文深入探讨了Python的内存管理机制,涵盖了垃圾回收、引用计数和内存池机制。通过具体示例和专业解释,帮助读者理解Python如何高效地管理和释放内存资源。 ... [详细]
  • JavaScript 中创建对象的多种方法
    本文详细介绍了 JavaScript 中创建对象的几种常见方式,包括对象字面量、构造函数和 Object.create 方法,并提供了示例代码和属性描述符的解释。 ... [详细]
  • 本文详细介绍了在不同操作系统中查找和设置网卡的方法,涵盖了Windows系统的具体步骤,并提供了关于网卡位置、无线网络设置及常见问题的解答。 ... [详细]
  • 云函数与数据库API实现增删查改的对比
    本文将深入探讨使用云函数和数据库API实现数据操作(增删查改)的不同方法,通过详细的代码示例帮助读者更好地理解和掌握这些技术。文章不仅提供代码实现,还解释了每种方法的特点和适用场景。 ... [详细]
  • 深入解析Java虚拟机(JVM)架构与原理
    本文旨在为读者提供对Java虚拟机(JVM)的全面理解,涵盖其主要组成部分、工作原理及其在不同平台上的实现。通过详细探讨JVM的结构和内部机制,帮助开发者更好地掌握Java编程的核心技术。 ... [详细]
  • 在PHP后端开发中遇到一个难题:通过第三方类文件发送短信功能返回的JSON字符串无法解析。本文将探讨可能的原因并提供解决方案。 ... [详细]
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社区 版权所有