一般只要在这些地方, 设置 一个连接a, 让href等于这个资源就好了. 这样当点击这个资源时, 因为浏览器并不能直接打开这些exe, zip等文件,因此会弹出下载对话框. 固然这个跟你的浏览器的设置/功能/插件等有关系.php
好比:<a href="foo.bar.zip" title="点击下载"> 下载 </a>
css
分清楚两个数组, 第一个数组是, 设置上传参数的数组. 另外一个是 获取上传文件的信息数组. 主要是第一个数组, 由于第一个数组是设置的,你能够修改和控制的, 而第二个数组, 你只是被动的获取信息, 你对它是无能为力的, 你不能对它进行修改什么的.html
上传文件的名称分为两个部分, saveName是保持的文件名(不包括扩展名), 而saveExt才是设置的扩展名, 一般扩展名是不须要修改的,不用管的.前端
上传文件的保存路径是个重要问题, 包括: rootPath, savePath, autoSub, subName, 最后的真实存放路径是 三个相加 即: rootPath/savePath/subName / 文件名
一般rootPath(若是不设置的话)就是站点的根"/", 而savePath也能够设置多个子目录的, 好比: `savePath="./Public/Uploads/"jquery
maxSize是上传文件的容许最大值, 一般咱们只容许上传 图片, 并且是jpg|png|gif等, 因此上传最大值设为5M就彻底足够了,固然若是你要上传的是压缩文件,作下载 网站的话, 那是另外的事了.linux
默认的使用的是 Local类(upload的默认 驱动类)sql
namespace Think\Upload\Driver; class Local{
一个请求 包括: 请求头 + 请求体
请求头包括: 请求方法(get/post) 站点名称/好比www.foo.com 使用的http协议版本 好比: http1.1
请求体: get方法的请求内容被放在请求头中, 因此 get的请求体为空; post的请求体 根get的请求内容相似 也是由 key=value组成的 用& 链接的字符串.chrome
enctype: 表示 表单在将数据发送到服务器以前, 须要对发送到服务器的内容进行编码. 根据表单 中的控件的类型和 传递数据的不一样, 有三种编码: 一是 text/plain 纯文本式的编码, 只是将空格转换为 加号+; 二是 application/x-www-form-urlencoded: application/x表示是非标准的mime, urlencoded表示将要传递的数据 进行 url数据编码. 即咱们常见的 传递 username, password captcha等内容的表单所用的编码. 普通的post/get就是用的这种编码; 三是, multipart/form-data表示的是将数据进行二进制编码, 能够传递二进制内容, 好比exe/rar文件, 图片, 音频/视频等内容.(实际上, 此时的Content-type就是 multipart/form-data了) 因此 凡是要上传文件的 form 都应该设置 enctype为 ...数据库
input的file域 ,就是由 两个部分组成的, 一个是前面的 文本域, 另外一个是后面的 browse... 按钮. 即这两部分加起来, 才是一个 文件域.编程
Tp的 upload类, 须要 上传驱动, 默认的驱动叫 local. 这个Local 并非 凭空想象的, 而是真实存在的一个 类. 它在 \Think\Upload\Driver 目录中,叫 class Local{...}
其中, 正是在 这个Local类中, 有 方法 checkRootPath($rootpath) , 和 checkSavePath($savepath). 正是在 checkRootPath中, 判断了
public function checkRootPath($rootpath){ if(!(is_dir($rootpath)&&is_writable($rootPath))) { $this->error = '上传根目录不存在, 请尝试手动建立'.$rootpath; return false; } $this->rootPath = $rootpath; return true; }
从上面的代码能够看出, 若是$rootpath不是一个目录(即 真的不存在), 或者, 即便$rootpath是一个目录, 可是 若是它不可写, 都会报错: '上传根目录不存在, 请尝试手动建立'.$rootpath
因此 这里的 报错提示 其实也不是很是恰当, 容易让人产生误解: 好比我明明已经建立了上传目录, 上传目录已经存在, 你还包上传根目录不存在, 就让人有些困惑了, 此时你能够提示: 目录不可写. 或者你分两次 if(!is_dir($rootpath)) { 目录不存在... ;} elseif(!is_writable($rootpath){ ...目录不可写...} 来提示 错误信息, 也能够, 也更好.
private $this->uploader
的??: C('FILE_UPLOAD_TYPE')
来得到的, 若是没有显式地传递 上传驱动名称, 好比 ftp等, 就从convention.php中的配置中得到, 而 C('FILE_UPLOAD_TYPE')的配置 正好就是 "Local" 因此默认的就是使用的 \Think\Upload\Driver中的Local.class.php 类文件驱动.除了tp的上传类 Upload类中的设置: $this->maxSize(这个是以字节为单位进行计算), 还 须要 设置php 语言自己 对上传文件大小的限制(默认只有 2M) . 这个是在php的配置文件
php.ini中设置 upload_max_filesize:
; Maximum allowed size for uploaded files. ; http://php.net/upload-max-filesize upload_max_filesize = 0 (设为0就是不限制大小)
上传文件在服务器上的名字显示中文乱码?
二是 "网盘"的 极速上传. 其实是先计算出你上传文件的md5, 而后跟网盘的 md5库进行比对, 看md5库里有没有 你要上传文件的md5. 若是有,就没必要再上传了, 只是在你的 网盘空间 生成一个 文件连接就行了, 连接 到库文件. 这样既节省带宽, 又节省 服务器的 空间.
不能用点号或-> 来获取, 前者会把数组和后面的内容看成一个 字符串来 链接输出; -> 会把前面看成一个对象来输出, 会报错: array不是一个0bj , 因此 也就是说, php中的 对象只能用 -> 来输出, 不能 用点号了 由于点号被用做字符串链接运算了
也不能使用 中括号 [], 那是求数组元素的值
应该用 php提供的全局函数 : count 或 sizeof. (sizeof是count的别名alias, 同样的) 可是 count 在计算 二维数组的时候, 有第二个参数 [COUNT_RECURSIVE]这个常数. 若是为0
(默认)的不递归计算, 为1 则递归计算. 基本上 为1 的是用不上的.
https://blog.csdn.net/dreamboycx/article/details/9171781, https://blog.csdn.net/steven_liwen/article/details/51965954 http://www.phpernote.com/php-function/789.html
共有5个版本, 依次是: chromium 金丝雀 Dev Beta Stable 稳定版. chromium是每隔几个小时就有新的版本出现...
$file['savepath'] = $this->savePath . $subpath;
上传文件的类型'type' => string 'application/octet-stream'
表示是 8进制数据流(也就是二进制流)
'application/x-msdownload' 表示是windows的dll, exe等文件的mime类型
$this->
来引用函数, 说明是类的成员函数, 不然就是全局函数,好比Upload中的 md5_file, $file['tmp_name']) sha1_file两个函数 Tp的Upload类, 主要也是对php原生的 上传相关函数 做了一些调用和封装,
关于文件名, 有几回变换: name(原来自己的名称) -> tmp_name(上传后保存在 upload_tmp_dir/ 目录中的临时名称, 由系统自动生成) -> saveName(最终保存在服务器上的名称)
好比:
function upload($files){ // 一般都不会设置upload函数的参数: 上传文件数组, 所以 $files==='', 因此, 这里的$files 就是 $_FILES; // 后面是对每一个文件进行遍历: foreach($files as $key => $file) // 获取上传文件的md5: md5_file, sha1_file($file['tmp_name']... // 要注意 , 获取文件的md5_file中的文件参数, 必须是 "绝对路径", 并且是从 点号开始的 绝对路径 : // $fn = './Honda/Home/Controller/deny.txt'; // if(is_file($fn)) echo '<p> 文件的md5是: '.md5_file($fn).'文件的sha1是: '. sha1_file($fn). '</p>'; }
并且对一个类来讲, 魔术方法 __get, __set , __isset几乎是必须的. __construct 和 函数getError(return $this->error;) 根据须要而定.
前端的复选框, 是将多个选项的名字 , 设置为 同一个数组, 这样, 赋值原理: ** 在后台$_POST的时候, 前端的多个选项值就会传到 $_POST的同一个名字的元素下, 从而造成一个二维数组, 这个二维数组的 有一个 元素, 索引名字为 前端的 name, 值就为你的选项, 即:**
$_POST = array('hb' => array('lq', 'zuq'....); dump 出来就是: array (size=1) 'hb' => array (size=3) 0 => string 'lanqiu' (length=6) 1 => string 'zuqiu' (length=5) 2 => string 'paiqiu' (length=6) hb: Array <p> <label>选择的爱好:</label><br> 篮球 <input type="checkbox" name="hb[]" value='lanqiu' /><br> 足球 <input type="checkbox" name="hb[]" value='zuqiu' /><br> 排球 <input type="checkbox" name="hb[]" value='paiqiu' /><br> </p> foreach ($_POST as $key => $val){ echo '<p>'.$key.": ". $val; // 的结果就是: hb: Array } echo "你的爱好是: ". implode(',' $_POST['hb'])); 而raido的处理更简单, 后台根本就不用改, 同样取获得 , $_POST 就是一个普通 的一维数组 <label>选择的爱好:</label><br> 篮球 <input type="radio" name="hb" value='lanqiu' /><br> // 后台赋值的原理: 名字是同样的, 因此, 无论你选哪个, 后面选择的, $_POST['hb'] 老是只有一个, 足球<input type="radio" name="hb" value='zuqiu' /><br> // 并且 后面的值老是会覆盖前面的值 排球 <input type="radio" name="hb" value='paiqiu' /><br>
一般在使用js bootstrap, jquery等的时候, 都是使用的压缩版的, 开发中的 min就是 压缩版的意思,好比 jqury.min.js, bootstrap.min.css, bootstrap.min.js
bs中的btn的用法:
bs中大量的使用了data-自定义属性?
bs中为何使用了btn-primary样式外 还要写 btn?
.... display: inline-block; padding: 6px 12px; font-size: 14px; font-weight: normal; line-height:...
link表示连接, 一般引入css文件的时候, 只写 rel="stylesheet"就好了,没必要写type
html 原生button和input-button的区别?
自己 html中确实是有 button 这个 标签元素的!
<button>...</button>
配合使用, 而input type=button 是一个闭合标签<button type="button"> (注意type=button并很少余! )... </button>
表单的input 有不少种输入类型, 各自的做用要 弄清,好比 : input type="image" 则它并不单纯的是一个image, (若是单纯的img使用 <img>标签就行了, 干吗还用input-image?) 而是一个 带有 submit功能的 以图片形式的 submit按钮
jquery和js的事件冒泡: 在 mouseover和 mouseenter上的区别, 根据二者的 字面意思上就能够区分: over是悬停,能够 没必要直接进入, 因此mouseover 不管鼠标指针穿过 被选元素仍是 其子元素, 都会触发mouseover事件. 而mouseenter事件是只有在鼠标指针真的穿入 被选元素时才触发.
linux中的 LSB是什么?
在数据库的模型类实例化时,
https://www.zhihu.com/question/39827177
一套既成的可迁移的实现特定目的的Configuration叫作Profile,例如手机里的静音Profile、仅震动Profile。Profile这个词很很差翻,本意是指一系列对特定个体的不必定全面的描述,翻成轮廓更准确但显然不符合习惯,因此常见翻译是档案。可是又显然,说静音档案、仅震动档案之类的也很不符合习惯,因此实际使用中Profile的翻译跟着场景变化很大。例如蓝牙的各类应用模式原文就是Profile,A2DP Profile什么的,但翻译成了模式.