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

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\tmp\php17.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/:id\d|md5' => array('Index/upfile', array('status' = > 1), array('ext' => 'html')),

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

tp剩余未验证内容-3的更多相关文章

  1. tp剩余未验证内容-8

    模型类的自动验证? 分为自动验证, 和 动态验证(手工验证), 前者的验证规则是定义在模型类中的, 所以要自己创建 扩展的/继承的模型类, 同时用 D方法实例化模型类 而动态验证是 先调用 valid ...

  2. tp剩余未验证内容-7

    bash脚本中 的 set -e表示 exit immediately if a simple command returns a non-zero value.主要是为了防止错误被忽略.会被立即退出 ...

  3. tp剩余未验证内容-6

    杂项 系统中的电感线圈元件, 虽然不消耗电能, 但是会 占用系统的容量(相当于占用资源但是不做事), 会使系统 的发电量的使用效率降低, 线路损耗增大, 发出同样有功用电量所需的设备容量扩大 将感性元 ...

  4. tp剩余未验证内容

    new Image(宽度,高度) $(image).attr('src', ...).load(function(){....}) load表示浏览器从服务器下载(装载)对象完成, 这个load方法很 ...

  5. tp剩余未验证内容-4

    关于pop-up被blocked的问题 首先 这个pop-up的功能叫 popup blocker , 它是浏览器(包括ff, chrome等) 自身 所内置 的一个功能, 不是 安装的外部 插件/或 ...

  6. tp剩余未验证内容-2

    如何设置一个 "资源" (文件/图片/zip/视频等)在点击时, 自动开始下载? 通常只要在这些地方, 设置 一个链接a, 让href等于这个资源就行了. 这样当点击这个资源时, ...

  7. tp剩余未验证内容-5

    经过实践, ie678是不能正确显示解析bs的,所以要用ff和chrome浏览器. page-header类是有特殊样式的 在标题下有一条浅色的细线条,源代码中有: border-bottom: 1p ...

  8. tp未验证内容-9

    在tp的数据库配置中, convention.php中所有的选项都没有设置,要自己在Home/conf/config.php中自己设置, 注意几个地方,一是数据库的名字是: db_name,不是db_ ...

  9. angularJs按需加载代码(未验证)

    一网友写的AngularJs按需加载代码,但未验证,放着备用.   application.config(               function($routeProvider) {       ...

随机推荐

  1. Metasploit渗透技巧:后渗透Meterpreter代理

    Metasploit是一个免费的.可下载的渗透测试框架,通过它可以很容易地获取.开发并对计算机软件漏洞实施攻击测试.它本身附带数百个已知软件漏洞的专业级漏洞攻击测试工具. 当H.D. Moore在20 ...

  2. 超简单系列:ubuntu 13.04 安装 apache2.2+mod_wsgi+Django

    1,Ubuntu更新系统 sudo apt-get update sudo apt-get upgrade 2,安装apache,mod_wsgi,Django sudo apt-get instal ...

  3. 读取文件任意位置的内容——RandomAccessFile

    http://www.cnblogs.com/Sunw/p/3801145.html http://www.cnblogs.com/dukc/p/4776868.html http://www.cnb ...

  4. codeforces 975C Valhalla Siege

    题意: 有n个巫师站成一列,每个巫师有自己的血量. 一个人射箭攻击他们,每次造成若干点伤害,巫师按照给定的顺序承受伤害,如果伤害大了,那么死掉,伤害落到下一个巫师身上. 如果一轮攻击之后,所有的巫师都 ...

  5. UBuntu sudo 命令 :xxx is not in the sudoers file. This incident will be reported.

    [1]分析问题 提示内容翻译成中文即:用户XXX(一般是新添加的用户名称)没有权限使用sudo. 解决方法修改新用户的权限,具体操作即修改一下/etc/sudoers文件. [2]切换至root用户模 ...

  6. 不能安装vmtools解决:一个命令安装

    https://blog.csdn.net/fly66611/article/details/77994339 换好源 sudo su apt-get update apt-get dist-upgr ...

  7. sqoop使用经验总结及问题汇总

    问题导读1.导入数据到HDFS,需要注意什么?2.在测试sqoop语句的时候,如何限制记录数量?3.sqoop导入时什么情况下会多导入一条数据? 一.sqoop 导入数据到HDFS注意事项 分割符的方 ...

  8. CentOS7 安装 mysql8

    本文主要从以下几个方面对自己在centos7 下安装mysql8过程做如下总结: CentOS7 安装mysql8 步骤: window下的Navicat 连接MySql8: 涉及到的Linux命令 ...

  9. 动态创建生成lambd表达式

    基于网上找的一段代码进行修改,目前扩展了NotContains方法的实现 using System; using System.Collections.Generic; using System.Co ...

  10. 如何在Linux中使用Firejail运行应用程序

    有时您可能希望使用在不同环境中未经过良好测试的应用程序,但您必须使用它们.在这种情况下,关注系统的安全性是正常的.在Linux中可以做的一件事是在沙箱中使用应用程序. “沙盒”是在有限环境中运行应用程 ...