tp剩餘未驗證內容-2

如何設置一個 "資源" (文件/圖片/zip/視頻等)在點擊時, 自動開始下載?

一般只要在這些地方, 設置 一個連接a, 讓href等於這個資源就好了. 這樣當點擊這個資源時, 因爲瀏覽器並不能直接打開這些exe, zip等文件,因此會彈出下載對話框. 固然這個跟你的瀏覽器的設置/功能/插件等有關係.php

好比:<a href="foo.bar.zip" title="點擊下載"> 下載 </a>css

關於文件的upload?

  1. 分清楚兩個數組, 第一個數組是, 設置上傳參數的數組. 另外一個是 獲取上傳文件的信息數組. 主要是第一個數組, 由於第一個數組是設置的,你能夠修改和控制的, 而第二個數組, 你只是被動的獲取信息, 你對它是無能爲力的, 你不能對它進行修改什麼的.html

  2. 上傳文件的名稱分爲兩個部分, saveName是保持的文件名(不包括擴展名), 而saveExt纔是設置的擴展名, 一般擴展名是不須要修改的,不用管的.前端

  3. 上傳文件的保存路徑是個重要問題, 包括: rootPath, savePath, autoSub, subName, 最後的真實存放路徑是 三個相加 即: rootPath/savePath/subName / 文件名 一般rootPath(若是不設置的話)就是站點的根"/", 而savePath也能夠設置多個子目錄的, 好比: `savePath="./Public/Uploads/"jquery

  4. 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){ ...目錄不可寫...} 來提示 錯誤信息, 也能夠, 也更好.

upload類自己在 $config 配置中, 作了一些 預先的設置/設定, 好比 'rootPath' => './Uploads', 'savePath' => '', 'saveName' => array('uniqid', '');因此, 除非你不須要對上傳文件作進一步處理, 不然, 一般,都應該 "顯式地對這些配置 作設置說明"

upload是怎樣 實例化上傳類對象 private $this->uploader的?

  • 是在 upload類的 構造函數中, public function __construct($config, $driver, $driverconfig)中, 調用 了類的private 方法setDriver().
  • 在setDriver中 首先得到 $driver, $driverConfig字符串, 而後得到 $class驅動名稱, 而後 建立對象: $this->uploader = new $class($config);
  • 其中 $driver和 $driverconfig是經過 ?: C('FILE_UPLOAD_TYPE') 來得到的, 若是沒有顯式地傳遞 上傳驅動名稱, 好比 ftp等, 就從convention.php中的配置中得到, 而 C('FILE_UPLOAD_TYPE')的配置 正好就是 "Local" 因此默認的就是使用的 \Think\Upload\Driver中的Local.class.php 類文件驅動.

tp框架, 以及php 以及包括js編程, 都是 一個重要的思想就是, 將 "不變" 和 "變", "字符串常量"和變量, 要創造性 的結合起來, 組合起來, 即: 凡是在 對(只能是)變量賦值的地方 , 好比 $savePath, $this->savePath, 或 $config = array(....)中, 均可以用 ='/Uploads/'. $category 的方式來賦值 這樣 savePath就能夠根據不一樣狀況而改變了.



關於在tp框架中上傳文件的大小限制, 實際上, 是多重限制了.

除了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就是不限制大小)

關於upload上傳的問題?

  • 上傳文件在服務器上的名字顯示中文亂碼?

  • 上傳文件時 $file或$_FILES中生成的md5 碼和 sha1 有什麼做用?
    md5, sha1, crc32這三種校驗碼的特色是: 對於一個文件, 若是文件的內容沒有作修改,那麼即便他的文件名改變, 則他的校驗碼不變; 反之, 若是文件的內容做了修改, 即便文件的名稱不變, 則他的校驗碼也不一樣. 因此有幾種用途:
    一是, 網站貼出(上傳)文件的md5 sha1碼, 你能夠跟你在本地的文件的md5校驗碼相對比, 若是相同, 則代表文件是完整的,沒有作修改, 反之,若是不一樣, 則說明被做了手腳的. 一樣的, 你從網上下載的應用程序, 原程序的校驗碼md5的做用也跟這個相同;
  • 二是 "網盤"的 極速上傳. 其實是先計算出你上傳文件的md5, 而後跟網盤的 md5庫進行比對, 看md5庫裏有沒有 你要上傳文件的md5. 若是有,就沒必要再上傳了, 只是在你的 網盤空間 生成一個 文件連接就行了, 連接 到庫文件. 這樣既節省帶寬, 又節省 服務器的 空間.

怎樣獲取數組的長度?

  • 不能用點號或-> 來獲取, 前者會把數組和後面的內容看成一個 字符串來 鏈接輸出; -> 會把前面看成一個對象來輸出, 會報錯: array不是一個0bj , 因此 也就是說, php中的 對象只能用 -> 來輸出, 不能 用點號了 由於點號被用做字符串鏈接運算了

  • 也不能使用 中括號 [], 那是求數組元素的值

  • 應該用 php提供的全局函數 : count 或 sizeof. (sizeof是count的別名alias, 同樣的) 可是 count 在計算 二維數組的時候, 有第二個參數 [COUNT_RECURSIVE]這個常數. 若是爲0

(默認)的不遞歸計算, 爲1 則遞歸計算. 基本上 爲1 的是用不上的.

  • count還能夠計算對象的 屬性的 個數.

爲何設置了 upload_max_filesize後, 仍然不能上傳大文件? 對上傳的臨時目錄也不能少, 並且要有 php進程全部者有寫入的權限 . php腳本運行到底有哪些限制? 參考:

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

  • 緣由, 在上傳大文件的時候, 不僅是對上傳文件自己的大小 要設置, 還有就是 php語言爲了安全, 對腳本運行的自己 多項配置作了限制. 好比 一個腳本執行的最大時間, 你不能過長了, max_execution_time, 默認的是30秒, 一般你能夠設置爲 600(秒)
  • 自己限制了一個腳本佔用內存的大小, memory_limit 默認是128M, 一般你能夠設置爲200M
  • 自己在 表單上傳時 也作了限定, 包括 post_max_size表單上傳時一次能夠post的最多內容(默認是8M, 你一般能夠設置爲200M) ; max_input_time 即input接收文件輸入的最大時間, 默認是60s, 一般你能夠設置爲 600秒.
  • 除了這四個設置外, 基本上就沒有問題了, 另外的 file_uploads要設置爲0n, 還有就是上面的upload_tmp_dir目錄 必需要設置, 且要有寫入權限. (固然你在上傳表單的時候, 仍是應該給用戶/讀者一些 提示說明, 告訴 用戶能夠上傳文件的最大尺寸; 以及其餘一些說明項目,好比只能傳遞圖片, 就要設置: $config = array(...., 'exts' => '.jpg, .png, .gif, .jpeg' 等)

fedora安裝 chrome瀏覽器

共有5個版本, 依次是: chromium 金絲雀 Dev Beta Stable 穩定版. chromium是每隔幾個小時就有新的版本出現...


被上傳的文件 最後, 在盤上的實際存儲目錄是: savepath = 設置的savePath + subName/ (不包括rootPath). 有這樣的代碼:

$file['savepath'] = $this->savePath . $subpath;

上傳文件的類型'type' => string 'application/octet-stream' 表示是 8進制數據流(也就是二進制流)
'application/x-msdownload' 表示是windows的dll, exe等文件的mime類型

判斷一個函數是php的全局函數, 仍是類的成員函數, 其實很容易, 若是 前面有$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>';




}

在一個類中, 類的成員屬性, 能夠數組是 ,也能夠包括: $config=array(...)性質的數組, 也能夠是單獨的/ 獨立的 變量, $private_name private $error; private $uploader; 等等.

並且對一個類來講, 魔術方法 __get, __set , __isset幾乎是必須的. __construct 和 函數getError(return $this->error;) 根據須要而定.

上傳文件保存錯誤? 是由於 上傳文件的類型不對? 在Local類的代碼中???

Warning: POST Content-Length of 10926845 bytes exceeds(超出, 超過...界限) the limit of 8388608 bytes in Unknown on line 0表示的是, 在上傳大文件的時候, post的傳送數據量 超過了 post_max_size的設定值, 這個設定值是 8M

複選框和單選框的操做:

前端的複選框, 是將多個選項的名字 , 設置爲 同一個數組, 這樣, 賦值原理: ** 在後臺$_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

所謂框架, 就是從此在寫 html前端和js和php後臺的時候, 都不用/少用 原生的html東西了, 習慣於直接用bs,jquery,tp等給咱們搭好的那一套了,這些框架都是人家反覆使用, 反覆論證,給你弄好了的, 就是適合最大多數的狀況!

bs中的btn的用法:

  • 有 btn-mute(提示的) , btn-primary(主要的 或者說是基本的按鈕), info(通知的), warning, danger, 以及default的.
  • 除了自己是button標籤元素使用這些btn類, 其餘任何dom元素, 只要使用這些btn類, 就會顯示爲 btn的樣式. 只是 一般不會這麼作, 一般還要考慮"語義"上的問題, 一般 會將 a連接 標籤應用爲 btn 樣式.

bs主要是/只是 修改了/定義了css的類, 並不會去修改html標籤元素 的 類型type , 原來是什麼type, 仍是什麼類型,並無改變. 因此, 即便是 button標籤, 你定義了class="btn btn-primary", 但仍是要 顯式的寫上 type="button"

bs中大量的使用了data-自定義屬性?

  • 這些data-屬性一般是使用在 div上的. div用上bs的類後, 一般就再也不是div了
  • data-toggle, 表示的是div 的內容 以"什麼事件觸發"? 即表現爲 什麼 形式/外觀? 好比: data-toggle="modal"/popover, 或 tooltip等
  • data-target表示的是事件的目標, 表示 數據 的來源???

bs中爲何使用了btn-primary樣式外 還要寫 btn?

  • 是由於這兩個class樣式, 實際上定義的css是不一樣的, 不重複的.
  • 如同 寫原生的css的時候, 要將多個樣式中,大量重複的內容 提取出來, 寫成單獨的一個樣式同樣, bs的按鈕也是這樣, btn樣式是 "基礎樣式" 的代碼, 其餘 "btn-primary" "btn-warning"等樣式只是 額外的, 不一樣的樣式那部份內容. 這樣作的 好處是: 實現"基礎樣式"和 "附加樣式"在代碼上的分離.
  • 好比: btn樣式就規定了不少的css樣式:
.... 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標籤的功能更多, 由於是非閉合標籤, 因此 在標籤之間能夠聽任何東西, 好比文本,好比img等都是能夠的, 而input-button就只能是設置其value值
  • button若是放在form表單中, 不一樣的瀏覽器對它的做用解釋的不同, 好比ie認爲它是一個 帶有 submit 功能的提交按鈕; 而 其餘非ie 的瀏覽器好比firefox等認爲它就是一個普通的按鈕, 因此 若是要使用 button標籤 的話, 在任什麼時候候, 都應該顯式地指定其 type: <button type="button"> (注意type=button並很少餘! )... </button>
  • 表單的input type=button 的功能就要簡單得多, 就只是一個 btn. 按鈕而已沒有其餘什麼附加的做用. 因此 若是你只是 想在form表單中 生成一個按鈕的話, 最好仍是用 input type=button.

表單的input 有不少種輸入類型, 各自的做用要 弄清,好比 : input type="image" 則它並不單純的是一個image, (若是單純的img使用 <img>標籤就行了, 幹嗎還用input-image?) 而是一個 帶有 submit功能的 以圖片形式的 submit按鈕




jquery和js的事件冒泡: 在 mouseover和 mouseenter上的區別, 根據二者的 字面意思上就能夠區分: over是懸停,能夠 沒必要直接進入, 因此mouseover 不管鼠標指針穿過 被選元素仍是 其子元素, 都會觸發mouseover事件. 而mouseenter事件是隻有在鼠標指針真的穿入 被選元素時才觸發.

linux中的 LSB是什麼?

  • lSb lease significant bit 最低有效位, MSB最高有效位, 好比0x12345678, 16位的lsb就是: 0x5678
  • 可是 linux中的lsb是 linux standard base標準基礎. 就是規定一系列二進制的基礎架構和接口的.
  • 安裝某些軟件的時候, 須要 lsb的版本知足必定要求, 好比: lsb>=4.0(因此, 若是要用新的軟件的話, 可能就係統的 不少組件 的版本就 不符號要求了)
  • 安裝 lsb: dnf install redhat-lsb. 就能夠提供命令: lsb_releas -a.... 或者查看lsb的配置文件: cat /etc/reahat_lsb

在數據庫的模型類實例化時,

  • 使用M(); 表示使用 空模型類, 進行原生sql語句;
  • 使用 M('User'); 表示使用標準的 UserModel模型類(沒有其餘擴展方法和自定義屬性), 操做對應的User表;
  • 如何 D('User'); 表示使用自定義的 模型類,其中的D表示 數據庫database, datatable表等的意思.

可使用 firefox 的命令行 來設置ff爲默認的瀏覽器: firefox --setDefaultBrowser.

不少時候, profie也被翻譯成 配置 的意思? config, settings, profile

https://www.zhihu.com/question/39827177一套既成的可遷移的實現特定目的的Configuration叫作Profile,例如手機裏的靜音Profile、僅震動Profile。Profile這個詞很很差翻,本意是指一系列對特定個體的不必定全面的描述,翻成輪廓更準確但顯然不符合習慣,因此常見翻譯是檔案。可是又顯然,說靜音檔案、僅震動檔案之類的也很不符合習慣,因此實際使用中Profile的翻譯跟着場景變化很大。例如藍牙的各類應用模式原文就是Profile,A2DP Profile什麼的,但翻譯成了模式.

相關文章
相關標籤/搜索