zoukankan      html  css  js  c++  java
  • tp剩余未验证内容-3

    为什么有时候会 出现 "上传文件保存错误"?

    public function save($file, $replace=true){
    
            /* 移动文件 */
            if (!move_uploaded_file($file['tmp_name'], $filename)) {
                $this->error = '文件上传保存错误!';    // 比如写权限, 或文件本身的一些问题, 或者 网络关闭/网速慢等的一些问题等
                return false;  // 都有可能 引起上传文件的 保存错误! 
            }
    }
    

    说明报 这个错的 原因是: 因为在 将 $file['tmp_name'] 临时文件 移动/剪切到 指定的 保存路径时, 发生了错误.
    可以将这个时候的 $file['tmp_name'] 打印出来看看.

    也有可能是 move_uploaded_file() 函数有特殊的要求??


    ===========================

    当文件上传成功时, 为什么在 $file你是看不到 tmp_name和 error的?

    • 因为在 public function upload()函数中,调用了 $this ->uploader 的 save() 方法: $this->uploader->save() 而且在 save成功的时候, 就把 这两个 元素给unset了:

    • 在upload上传时, 你要获取错误, 既可以用 Upload类 的 $this->getError(), 也可以用 $this->uploader->getError( 或 $up -> getError() ). 两者其实是一样的, 因为: 在 Upload类的 方法中:

    public function getError(){
    	return $this->error;
    }
    
    
     而在 upload方法中, 
    
    	if($this->uploader->save($file, $this->replace)){ // 上传成功时  就把$file中的 tmp_name和 error这两个索引给删除了的, 所以后来就看不到了....
    		unset($file['tmp_name'], $file['error'];
    		$info[$key] = 
     $file // 二维数组的索引名称 就等于当前遍历的文件名
    }else{
    
    		$this->error = $this -> uploader-> getError();  //  Upload类的私有成员error 就是由 上传类实例的getError来的. 所以两者是一样的. 
    }
    
    • **实在 要在 上传错误时, 查看 临时文件名称, 可以在 upload()方法中, 开始就 dump ($files) 或 dump($_FILES). 或者, 在 uploader的save()方法中, 甚至在 调用了$this->uploader->save()方法后, unset之前 都可以用 $file['tmp_name']去查看 上传文件的临时 文件名.... **

    上传时, 明明选择了文件, 却提示" 没有上传的文件"?

    这是因为: 当上传的文件超过了 php.ini 设置中的 Post_max_size(默认=8M )时, 表单将不会上传任何信息, 此时的 $_POST & $_FILES 将为 空值.
    因此, 正好在 upload方法中, 有: if(empty($file)) { $this->error = '没有上传的文件'; return false; }

    在上传的时候, 首先是生成了 $_FILES 数组, 从其名字 就可以看出, 这个是关于 多个上传文件的信息 组成的 二维数组. 这个 $_FILES 时php原生的东西, 跟任何框架, 任何函数方法都没有关系的.

    • 所谓的 upload类等 ,只是对 上传的 原生方法进行了加工和封装, 主要是增加了一些 内部判断 语句, 比如 它的private function check($file) { if(!$this->checkSize($file[
      size'))...; if(!$this->checkExt($file['ext']))...; if(!$this->checkMime($file['mime'])).....}

    • tp 上传类中, $files就等于 $_FILES了, 其中的每一个元素(文件)就是 $file. 最后生成的 信息 时$info. 不能搞混了.

    • 这个数组中 的索引名称就是 上传表单的input的那个name. 然后 元素的值就是关于这个上传到 临时目录的文件的信息组成的数组$file

    • 原生的 $_FILES 中, 每个文件的原数据 其实只有 5个: 即 name, type , tmp_name, error(错误代号, 默认为0, 出错为1) ,size 跟$info记录的不同

    • 上传文件的tmp_name其实是在 c:/wamp/tmp目录中, 默认的临时文件名称是 php(当前上传文件的序号, 按16进制的方式进行 编排的. ).tmp 比如: php10.tmp, c:/wamp/tmp/php10.tmp, php16.tmp php1A.tmp(超过16后就是A开始的了)....等等.

    array (size=1)
      'upfile' => 
        array (size=5)
          'name' => string 'foobar.exe' (length=15)
          'type' => string 'application/octet-stream' (length=24)
          'tmp_name' => string 'C:wamp	mpphp17.tmp' (length=21)
          'error' => int 0
          'size' => int 3463680
    
    
    

    为什么c:/wamp/tmp目录中 没有 上传临时文件? 即使有临时文件, 也不能再使用了?

    • 如果要手动处理 上传文件的话, 步骤是: 原始文件 -> 中间临时 上传到 临时目录 c:/wamp/tmp -> 再由用户来自己按照需要处理

    • 临时目录中的文件通常被 move走了的, 所以没有了.

    • 如果不是move, 而是copy的话, 那么 临时上传文件就一直存在, 当这个脚本执行完毕后(即退出上传过程后), 这个临时文件虽然还存在, 但是不能再被处理了, 因为它
      已经不是一个 is_uploaded_file() 了, 所以, 你用 move_uploaded_file() 来处理的话, 就会报错了.

    所以在 上传 封装方法中, 由判断:

            /* 检查是否合法上传 */
            if (!is_uploaded_file($file['tmp_name'])) {
                $this->error = '非法上传文件!';
                return false;
            }
    
    

    move_uploaded_file()方法的过程?

    • 如同这个函数的名字一样, 它有几个检查的地方, 首先这个文件必须是:经过httppost的方法和机制上传的文件,也就是 is_uploaded_file() 要返回真,

    • 其次, 这个文件, 会 去 上传文件的临时目录c:/wamp/tmp/ 目录中 去查找 $file, 如果找到了 就 "move" 到 新的位置, 注意是move, 所以 临时文件就没有了.

    • 但是 , 并不是 每一次 move_uploaded_file都会成功, 可能会因为 一些原因, 比如: 权限, 比如 文件本身的一些 特殊原因 等等, 可能会使得 这个move 函数 失败, 从而返回false.


    最后, 就是 如果 要 避免 上传 保存的文件名, 出现 中文乱码的情况(不必自讨苦吃! ), 上传保存文件最好 就不要使用 中文 名称. 而是使用 纯数字 来命名, 比如:

           $cfg = array(
    			'rootPath'	=> './Public/',
    			'savePath'	=> 'Uploads/',
    			'saveName'	=> time().mt_rand(),  // 这里就是使用 的 直接 "字符串"的方式, 是 用函数拼接字符串. 
    		);
    

    即使这里的保存文件名是数字或 其他什么的 数字和字母 任意拼接, 都没有关系! 因为最后,都 要把这个 $info的 信息中的 savename 和原始name 以及其他一些信息都要保持到 数据库中去的.


    ajaxStart在页面每一个ajax请求开始时都会触发, 所以 每次在ajax请求时都会出现 loading条...

    正确认识jquery的动画 show/hide 和 slideToggle, fadeToggle的区别?

    • 它们的区别并不在 速度快慢上, show和hide 同样可以设置 变化的时间;
    • 区别也不在 动画过程中速度的变化上, 因为都有easing参数
    • 它们真正的区别在于 动画的方向上, 比如slide..., 和 表现形式上 比如 fade...
    • 只是show和hide 在外在的表现形式上没有其他两个那么明显.

    为了避免每次ajax请求时, 前端都要从服务器上去交互 取数据, 可以将jquery的ajax取得的数据进行 缓存, jquery的缓存是 使用方法 data...

    ### 一个很重要的认识, 网页应用是一个 B/S 模式的程序. 因此是在 Browser 和 Server之间进行数据交互. 所以你在 浏览器上看到的任何东西 ,都是 从 服务器上来的. 就算是 JavaScript脚本, 虽然执行时是 在 客户端的 浏览器上, 但是 js脚本中 要取数据(比如 文件, 图片等) 都是 指的是 服务器上的内容. 也就是 js 操作的都是 服务器上的东西, 他跟本地文件系统 **基本上是没有关系的**

    就算js提供了 操作本地文件系统的方法, 那感觉也是一种 "倒退", 因为操作本地文件, 完全可以使用java mfc, c, c++的东西. js操作本地文件系统, 需要使用 浏览器扩展 (不同浏览器的扩展也不一样)插件, 比如ie的 var fso = new ActiveXObject("Scripting.FileSystemObject"); 然后使用fso对象的方法进行操作. 而事实上, 很多浏览器,包括 firefox, 出于安全性的考虑,它是不允许你使用 ActiveXObject等这些控件/扩展的, 也就是说, 你是无法/不允许你 操作本地文件的.

    所以 要有一个认识: 你 在 js中,甚至整个web应用程序中, 使用的 文件/图片等 都是从服务器上去取的, 因此, 你写它们的 地址时, 实际上是服务器上的资源/内容地址, 这个地址, 从 斜杠/ 这个 根路径开始的. (这个斜杠 / 就是表示 网站目录的根, 你能看到 服务器这个机器上的, 也只能是根目录以下的 内容.

    ===================

    在写jquery的动画的时候, 要注意选择 隐藏和显示 的属性问题, 究竟使用 visibility属性, 还是display属性,还是opacity等属性, 不同的属性, 及不同的方法产生的结果、效果是不同的。

    jquery的 "所有" 动画 函数 的参数都是一样 的! 都是: [speed], [easing,][,fn]

    • 所有的动画都支持 speed参数, 它是一个时间, 多少毫秒, speed参数有三种表现形式: 关键字: slow/normal/fast; 第二是0, 表示立即执行,这个跟参数为空(不设置参数)是一样的,但有时候, 还需要用这个0; 第三, 用具体的数字, 比如500
    • easing表示缓动参数(ease本身是 舒适, 慵懒的意思). easing表示了dom元素在整个动画过程中的 在不同时刻的速度/快慢 过程. 有默认的swing, linear. 其中linear是线性的, 即匀速移动的, 而swing是"摆动, 飘动的", 表示动画的过程速度是: 先快然后慢. 这个更充满动态, 所以是jquery的默认easing.
    • fn都是 回调函数.

    jquery的动画从大的方面来说, 可以分为两大类, 一类是 show/hide/slide../fade.. , 另一类是 animat. 要正确的选择是使用 show/hide/slide../fade.. 还是 animate, 关键在于搞清楚 前者的 实现原理, 也关键在于 考虑 "你的 动画对象是否要保持它的固有位置?"

    • 前者的实现 原理都是 通过设置 display:none来实现的, 后者可以实现任何的目的 而且最重要的是, 它可以设置: opacity: 不透明度

    • 所以, 如果你的动画对象 不需要 一直保持 他的固有位置, 那么你可以用第一类动画 (而且最好不要使用 visibility:hidden的 css)因为使用这个visibility:hidden的时候, 当你用show的时候, 还需要修改visibility:visible才能显示...

    • 如果你的动画对象, 需要一直保持 他的固有位置, 那么你就要 开始时, 使用 visibility:hidden, 在后来要显示的时候, 就不能使用第一类的方法, 因为这个会设置display:none, 把原来的位置给清了. 于是在需要显示的时候, 就要设置: visiblity: visible; 同时: 设置: anminae(opacity: 1.....)

    在js中的图片, 要得到并显示这些图片的时候, 其实图片的名称 图片叫什么, 是什么文件名, 并不重要. 因为在html中<img src="foo.jpg" > 就能显示了.所以, 图片重要的是 它的src. 因此对于 一个 图片img标签元素, 只要给它定义 src. 那么它就存在了, 就能显示出来了. 这个在图片从服务器下载 到内存, 缓存到内存, 然后再显示出来 load(function(){}) 非常有用.

    图片从服务器下载缓存到内存, 然后再显示, 这个使用的不是ajax, 而是load方法. 只是 从服务器上取数据, 然后载入动态条消失这个 是ajax. 当实现 ajax 载入图片 提示的时候, 要在 这个 提示图片本身上注册 ajax事件, 即: $("loadingImg").ajaxStart(function(){}).ajaxStop(....);



    表示作者的单词: author, writer, composer: author是最普通的, 随便哪个都可以是author. composer是作曲家,艺术家,有时候也可以说是比喻,美化的意思, writer 主要是指专业的职业的作家.

    chmod 的格式(也是linux命令的通用格式)就是: linux_command [options] +.... 也就是说 通常选项总是 紧跟着 命令的 , 总是第一项...比如: chmod [options] mode ... files.

    安装google浏览器?

    • 不一定要到google的官网去下载rpm包, 其他仓库 比如163等都可以下载到的

    • 安装gg浏览器之前, 要先安装redhat-release包, 从而提供 lsb_release命令和 /etc/lsb_release.d/core-4.1-ia32 ....等文件

    • 同时要安装libXss.so库, 表示的是: lib -X - Synchronize(scrn)[注意他的发音, 是 [['sɪŋkrə.naɪz] y不是发ai, o发的是2音] -Saver即是提供google和 图形界面 同步/同步处理的 保存器. 这个库文件需要安装 libXScrnSaver-1.2.2-9.fc23.i686.rpm包.

    • 运行gg浏览器提示不能使用root用户登录?
      to run as root, you must specify an alternate --user-data-dir for storage of profile information.
      解决方案,就是按照他所说的那样, 在root用户启动时, 加上选项: --user-data-dir=/tmp 就可

    [root@localhost Documents]# rpm -i google-Chrome-linux32.rpm 
    warning: google-Chrome-linux32.rpm: Header V4 DSA/SHA1 Signature, key ID 7fac5991: NOKEY
    error: can't create transaction lock on /var/lib/rpm/.rpm.lock (Resource temporarily unavailable)
    error: /tmp/google.sig.vFRXJl: key 1 import failed.
    Redirecting to /bin/systemctl start  atd.service
    
    安装时提示 , gg不能使用交易锁: transaction lock
    
    

    因为fc23 上的ff 版本太低, 所以 chrome提示 this computer will soon stop receiving google chorme updates because this linux system will no longer be supported.


    关于tp的路由?

    • 注意两个单词的区别, 一个是router,一个是route. 在开启路由的时候,用router表示把 "路由器" 打开, 是机器, 所以用 router: URL_ROUTER_ON, 另一个表示 "路由"规则 这个动作的就是用 route

    • 路由规则的书写 地方是在 模块内的配置文件, 因为模块本身不能被路由. 同时也正是因为这个原因, 在路由地址中通常都是用 "控制器/操作..."来表示,不会有 模块名的.

    • 在规则路由中, 路由只是支持 pathinfo 地址模式, 所以 路由表达式中, 除了 不必的内容部分外, 其他可变的部分(即动态参数) 必须要用 斜杠 / 进行分割: 即路由表达式只能是: (路由表达式总是从 "localhost/ "开始的) upfile/:foo 或 upfile/[:foo] 而不能是: upfile:foo, 或 upfile[:foo] 这两种写法都是 "完全静止内容" 不是动态参数的.

    • 关于参数, 分清三种参数,
      先是 url地址表达式中的参数, 这个在后面的路由地址中 可以使用, 也可以不使用, 如果使用的话, 只能用类似:1, :2的形式 来表示(但是在操作函数中 总是可以用 $_GET来获取的). 但是即使在后面的路由地址中 , 跟前面的参数名称相同的 地址部分 其实跟 动态参数是没有 任何关系的, 比如: 'upfile/:fileid' => 'Index/upfile/fileid/:1' 后面的fileid 跟前面的fileid 完全没有关系, 只是便于开发者理解, 你完全可以写作其他的内容,比如fileNo,fid等 而且这个是静态的内容, 必须照样写的.真正跟 :fileid对应的是:1.

    其次是:路由地址中的参数,这个是额外参数,(隐式参数) 不是url地址中的参数. 地址中的参数, 可以用字符串表示, 也可以用 array表示, 建议用array表示:
    第三是 路由参数. 路由参数总是用array形式, 放在路由地址的array 的最后面. 主要是做一些限制,但是基本上没有, 也很少会去用到. 只是你要知道它.

    一个完整的例子是: 'upfile/:idd|md5' => array('Index/upfile', array('status' = > 1), array('ext' => 'html')),

    当使用路由规则的时候, 并不会暴露 路由规则中的具体路由地址. 但是, 由于使用的是路由, 所以会将form表单中的参数以 键值对的方式跟在url的后面.这个也没有什么影响.

  • 相关阅读:
    Excelpackage的简单使用(导出用户信息并保存)
    set nocount on/off的作用,可配合存储过程使用
    在sql中case子句的两种形式
    C#开发微信门户及应用(1)--开始使用微信接口(转)
    张建总的一封信
    Jquery在线工具
    《EnterLib PIAB深入剖析》系列博文汇总 (转)
    微软企业库5.0 学习之路——第十步、使用Unity解耦你的系统—PART1——为什么要使用Unity? (转)
    结合领域驱动设计的SOA分布式软件架构 (转)
    ENode框架旨在帮助我们开发ddd,cqrs、eda和事件采购风格的应用程序。(netfocus 汤雪华)
  • 原文地址:https://www.cnblogs.com/bkylee/p/9119568.html
Copyright © 2011-2022 走看看