一般只要在這些地方, 設置 一個連接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什麼的,但翻譯成了模式.