tp剩余未验证内容-3

时间:2021-03-23 00:33:35

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

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. 什么是领域驱动设计&lpar;Domain Driven Design&rpar;&quest;

    本文是从 What is Domain Driven Design? 这篇文章翻译而来. ”…在很多领域,专家的作用体现在他们的专业知识上而不是智力上.“ -- Don Reinertsen 领域驱动 ...

  2. Wilddog - 野狗统计

    根据业务需求提出的统计代码. <!DOCTYPE HTML> <html lang="en-US"> <head> <meta chars ...

  3. LibLinear(SVM包)使用说明之(三)实践

    LibLinear(SVM包)使用说明之(三)实践 LibLinear(SVM包)使用说明之(三)实践 zouxy09@qq.com http://blog.csdn.net/zouxy09 我们在U ...

  4. RatingBar设置显示星星个数

    RatingBar评分控件 项目中遇到问题 marker一下: 关于自定义以及遇到的出现模糊情况 多半是因为切得图除颜色外 不一致的原因 如果大小也不一样,(沃日) 问题是这样的: 我可以通过OnRa ...

  5. 教程:在 VM Depot 中查找 Azure 可用的虚拟机镜像

     发布于 2014-07-08 作者 陈 忠岳 对于 Azure 的社区管理虚拟机资源库--VM Depot--的用户来说,网站的搜索功能已得到极大的改善.这一搜索能力的增强,可以帮助用户更容易地 ...

  6. Funny Sheep&lpar;思维&rpar;

    Problem 1606 - Funny Sheep Time Limit: 1000MS   Memory Limit: 65536KB    Total Submit: 612  Accepted ...

  7. Gym 101102C Bored Judge&lpar;set--结构体集合&rpar;

    这个故事告诉我们,WA了一定要找自己的原因... ... 当我开始用set去做的时候,发现一直过不去,一开始忘了把初始排名加进去,后来忘了第0秒,第0秒第一的id = 1 这个题目的做法也不只这一种, ...

  8. Android 手机应用开发经验 之 通过Socket&lpar;TCP&sol;IP&rpar;与PC通讯

    Android 是一个开源的手机操作系统平台,已经被非常多的开发者视作未来最有潜力的智能手机操作系统.而且,在很短的时间内就在Android Market上出现大量的第三方应用程序,供用户下载与使用, ...

  9. tensorflow bias&lowbar;add应用

    import tensorflow as tf a=tf.constant([[1,1],[2,2],[3,3]],dtype=tf.float32) b=tf.constant([1,-1],dty ...

  10. Swift基础

    github上找了swift中文翻译,上传到百度云,给大家分享下 链接:http://pan.baidu.com/s/1hqGOxfe 密码:asto