为什么有时候会 出现 "上传文件保存错误"?
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的更多相关文章
-
tp剩余未验证内容-8
模型类的自动验证? 分为自动验证, 和 动态验证(手工验证), 前者的验证规则是定义在模型类中的, 所以要自己创建 扩展的/继承的模型类, 同时用 D方法实例化模型类 而动态验证是 先调用 valid ...
-
tp剩余未验证内容-7
bash脚本中 的 set -e表示 exit immediately if a simple command returns a non-zero value.主要是为了防止错误被忽略.会被立即退出 ...
-
tp剩余未验证内容-6
杂项 系统中的电感线圈元件, 虽然不消耗电能, 但是会 占用系统的容量(相当于占用资源但是不做事), 会使系统 的发电量的使用效率降低, 线路损耗增大, 发出同样有功用电量所需的设备容量扩大 将感性元 ...
-
tp剩余未验证内容
new Image(宽度,高度) $(image).attr('src', ...).load(function(){....}) load表示浏览器从服务器下载(装载)对象完成, 这个load方法很 ...
-
tp剩余未验证内容-4
关于pop-up被blocked的问题 首先 这个pop-up的功能叫 popup blocker , 它是浏览器(包括ff, chrome等) 自身 所内置 的一个功能, 不是 安装的外部 插件/或 ...
-
tp剩余未验证内容-2
如何设置一个 "资源" (文件/图片/zip/视频等)在点击时, 自动开始下载? 通常只要在这些地方, 设置 一个链接a, 让href等于这个资源就行了. 这样当点击这个资源时, ...
-
tp剩余未验证内容-5
经过实践, ie678是不能正确显示解析bs的,所以要用ff和chrome浏览器. page-header类是有特殊样式的 在标题下有一条浅色的细线条,源代码中有: border-bottom: 1p ...
-
tp未验证内容-9
在tp的数据库配置中, convention.php中所有的选项都没有设置,要自己在Home/conf/config.php中自己设置, 注意几个地方,一是数据库的名字是: db_name,不是db_ ...
-
angularJs按需加载代码(未验证)
一网友写的AngularJs按需加载代码,但未验证,放着备用. application.config( function($routeProvider) { ...
随机推荐
-
什么是领域驱动设计(Domain Driven Design)?
本文是从 What is Domain Driven Design? 这篇文章翻译而来. ”…在很多领域,专家的作用体现在他们的专业知识上而不是智力上.“ -- Don Reinertsen 领域驱动 ...
-
Wilddog - 野狗统计
根据业务需求提出的统计代码. <!DOCTYPE HTML> <html lang="en-US"> <head> <meta chars ...
-
LibLinear(SVM包)使用说明之(三)实践
LibLinear(SVM包)使用说明之(三)实践 LibLinear(SVM包)使用说明之(三)实践 zouxy09@qq.com http://blog.csdn.net/zouxy09 我们在U ...
-
RatingBar设置显示星星个数
RatingBar评分控件 项目中遇到问题 marker一下: 关于自定义以及遇到的出现模糊情况 多半是因为切得图除颜色外 不一致的原因 如果大小也不一样,(沃日) 问题是这样的: 我可以通过OnRa ...
-
教程:在 VM Depot 中查找 Azure 可用的虚拟机镜像
发布于 2014-07-08 作者 陈 忠岳 对于 Azure 的社区管理虚拟机资源库--VM Depot--的用户来说,网站的搜索功能已得到极大的改善.这一搜索能力的增强,可以帮助用户更容易地 ...
-
Funny Sheep(思维)
Problem 1606 - Funny Sheep Time Limit: 1000MS Memory Limit: 65536KB Total Submit: 612 Accepted ...
-
Gym 101102C Bored Judge(set--结构体集合)
这个故事告诉我们,WA了一定要找自己的原因... ... 当我开始用set去做的时候,发现一直过不去,一开始忘了把初始排名加进去,后来忘了第0秒,第0秒第一的id = 1 这个题目的做法也不只这一种, ...
-
Android 手机应用开发经验 之 通过Socket(TCP/IP)与PC通讯
Android 是一个开源的手机操作系统平台,已经被非常多的开发者视作未来最有潜力的智能手机操作系统.而且,在很短的时间内就在Android Market上出现大量的第三方应用程序,供用户下载与使用, ...
-
tensorflow bias_add应用
import tensorflow as tf a=tf.constant([[1,1],[2,2],[3,3]],dtype=tf.float32) b=tf.constant([1,-1],dty ...
-
Swift基础
github上找了swift中文翻译,上传到百度云,给大家分享下 链接:http://pan.baidu.com/s/1hqGOxfe 密码:asto