日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > php >内容正文

php

PHP之MVC项目实战(二)

發(fā)布時(shí)間:2024/7/23 php 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PHP之MVC项目实战(二) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本文主要包括以下內(nèi)容

  • GD庫(kù)圖片操作
  • 利用GD庫(kù)實(shí)現(xiàn)驗(yàn)證碼
  • 文件上傳
  • 縮略圖
  • 水印
  • GD庫(kù)圖片操作

    <?php$img = imagecreatetruecolor(500, 300); //var_dumP($img); // //分配綠色 $green = imagecolorallocate($img, 0, 0xff, 0x0); //var_dump($green);//fill $result = imagefill($img, 0, 0, $green); //var_dump($result);//導(dǎo)出 imagepng($img, './green.png');// imagedestroy($img);

    創(chuàng)建畫(huà)布
    imagecreatefromXXXX XXX表示格式:
    //打開(kāi),利用已有的圖片創(chuàng)建畫(huà)布資源!
    imagecreatefromjpeg
    imagecreatefrompng,從png格式創(chuàng)建畫(huà)布
    imagecreatefromgif

    操作畫(huà)布
    利用一個(gè)個(gè)的工具函數(shù),完成畫(huà)布的處理的!
    選擇顏色,分配顏色
    如果需要使用某個(gè)顏色,在畫(huà)布上操作,一定要先將顏色分配到畫(huà)布上!
    利用函數(shù):
    imagecolorallocate(畫(huà)布,顏色).向畫(huà)布上分配顏色
    顏色是RGB,紅綠藍(lán),顏色需要三個(gè)參數(shù),分別表示R,G,B的值
    顏色標(biāo)識(shí)= imagecolorallocate(畫(huà)布,R,G,B)
    每個(gè)顏色值,是一個(gè)整型!
    0-255十進(jìn)制
    0x0 - 0xff 十六進(jìn)制

    填充畫(huà)布
    利用函數(shù):imagefill完成填充
    imagefill(畫(huà)布,填充位置X, 填充位置Y,顏色);
    將像素周?chē)倪B續(xù)的并且顏色相同的區(qū)域可以完成填充!
    填充位置使用填充點(diǎn)的坐標(biāo)表示:
    圖片位置的原點(diǎn)為 左上角!坐標(biāo)為(0,0) 因此右下角的坐標(biāo)是?(width-1,height-1 499,299)

    將畫(huà)布導(dǎo)出成圖片
    imageXXXX,XXX表示格式
    imagejpeg
    imagegif 導(dǎo)出成gif格式
    imagepng
    一個(gè)畫(huà)布可以導(dǎo)出多次,而且是任意格式!

    imagepng(畫(huà)布,保存文件);

    銷毀資源
    imagedestroy();

    利用GD庫(kù)實(shí)現(xiàn)驗(yàn)證碼

    <?php //require '111.php';$rand_bg_file = './captcha/captcha_bg' . mt_rand(1, 5) . '.jpg'; //echo $rand_bg_file; //創(chuàng)建畫(huà)布 $img = imagecreatefromjpeg($rand_bg_file);//繪制邊框 $white = imagecolorallocate($img, 0xff, 0xff, 0xff); //不填充矩形 imagerectangle($img, 0, 0, 144, 19, $white);//寫(xiě)碼值 //生成碼值,隨機(jī)的4個(gè)只包含大寫(xiě)字母,和數(shù)字的字符串! $chars = 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789';//32 個(gè)字符 //隨機(jī)取4個(gè) $captcha_str = ''; for($i=1,$strlen=strlen($chars); $i<=4; ++$i) {$rand_key = mt_rand(0, $strlen-1);$captcha_str .= $chars[$rand_key]; } //保存到session中 @session_start(); $_SESSION['captcha_code'] = $captcha_str; //echo $captcha_str; //寫(xiě)//先確定顏色,白黑隨機(jī)! $black = imagecolorallocate($img, 0, 0, 0); if(mt_rand(0, 1) == 1 ) {$str_color = $white; } else {$str_color = $black; }imagestring($img, 5, 60, 3, $captcha_str, $str_color);//保存 //imagejpeg($img, './captcha.jpg');//輸出到文件內(nèi)! //告知瀏覽器,發(fā)送的是jpeg格式的圖片 header('Content-Type: image/jpeg; charset=utf-8');//echo 'itcast'; imagejpeg($img);//輸出到瀏覽器端!//銷毀資源 imagedestroy($img);

    繪制邊框
    畫(huà)一個(gè)不填充的矩形!
    利用函數(shù)
    imagerectangle()完成

    imagerectangle(畫(huà)布,左上角X,左上角Y,右下角X,右下角Y,筆觸顏色);
    利用左上角,與右下角的坐標(biāo)確定矩形范圍!

    寫(xiě)驗(yàn)證碼

    寫(xiě)到 畫(huà)布上
    利用函數(shù)
    imagestring()
    imagestring(畫(huà)布,字體大小,位置X,Y,字符串,顏色);
    其中imagestring典型的是使用內(nèi)置字體!(不支持中文)。字體大小1-5.5最大!

    導(dǎo)出,保存
    imagejpeg();

    將驗(yàn)證碼展示到頁(yè)面上

    典型的:
    使用一個(gè)php文件,直接輸一個(gè)圖片內(nèi)容!
    直接輸出的請(qǐng)求的瀏覽器端
    imagejpeg(畫(huà)布,保存文件)
    如果沒(méi)有第二個(gè)參數(shù),則是直接輸出!

    此時(shí)應(yīng)該在輸出圖片內(nèi)容到瀏覽器之前,告知瀏覽器,當(dāng)前內(nèi)容是二進(jìn)制的圖片內(nèi)容!
    header();//
    header(‘Content-Type: text/html; charset=utf-8’);//告知瀏覽器發(fā)送的內(nèi)容以u(píng)tf8編碼形式的文件html數(shù)據(jù)!

    此時(shí),使用 img標(biāo)簽的src屬性,請(qǐng)求一個(gè)生成圖片的php程序即可顯示圖片!

    如果向?yàn)g覽器發(fā)送的是圖片,則如果有錯(cuò)誤瀏覽器不會(huì)顯示,會(huì)將報(bào)錯(cuò)信息當(dāng)作圖片內(nèi)容看待,所以此時(shí)如果要調(diào)錯(cuò),則此時(shí)
    要把header(‘Content-Type:image/jpeg’)先注釋!需要嚴(yán)格輸出的時(shí)候,PHP的開(kāi)頭

    文件上傳

    數(shù)據(jù)在存儲(chǔ)或者傳輸時(shí),存在兩種編碼:字節(jié)碼,二進(jìn)制碼!
    普通的字符串上傳到服務(wù)器需要字節(jié)編碼!
    但是將文件上傳的編碼是: 二進(jìn)制編碼!

    但是,默認(rèn)的,瀏覽器是不會(huì)處理二進(jìn)制編碼的!將所有的數(shù)據(jù)都當(dāng)字節(jié)碼字符串處理!

    因此上傳文件的第一個(gè)工作:
    告知瀏覽器,當(dāng)前表單內(nèi),有需要被二進(jìn)制編碼的數(shù)據(jù)!(編碼的數(shù)據(jù)是由多種編碼組成)
    利用表單的屬性:
    enctype=”multipart/form-data”

    <form action="112.php" method="post" enctype="multipart/form-data"> <input type="hidden" name="MAX_FILE_SIZE" value="50000" /> 商品名:<input type="text" name="goods_name" /> <br> 商品圖片:<input type="file" name="goods_img" /> <br> <input type="submit"></form>

    此時(shí)瀏覽器在碰到文件域時(shí),就知道以二進(jìn)制形式編碼!

    此時(shí),提交到服務(wù)器上表單內(nèi)的所有數(shù)據(jù)(字符串,文件)

    服務(wù)器的PHP代碼來(lái)處理數(shù)據(jù):
    對(duì)字符串的處理:保存$_POST變量?jī)?nèi)(內(nèi)存中)
    對(duì)文件的處理:將接收到文件,保存到服務(wù)器系統(tǒng)的臨時(shí)目錄下。有效期,當(dāng)前腳本結(jié)束!

    用戶需要在php的腳本執(zhí)行周期內(nèi),將臨時(shí)文件 持久化(拷貝到別的地方)
    利用函數(shù):
    move_uploaded_file();//移動(dòng)已經(jīng)上傳的文件
    移動(dòng)結(jié)果 = move_uploaded_file(臨時(shí)文件,目標(biāo)文件)
    上傳的臨時(shí)文件的信息,被保存到超全局?jǐn)?shù)組變量$_FILES中!
    為每個(gè)上傳的文件,整理5個(gè)信息:

    • name: 原始文件名
    • type: 類型。image/jpeg text/html 網(wǎng)絡(luò)上標(biāo)識(shí)資源類型方法。稱之為MIME(多用途internel郵件擴(kuò)展類型)類型。
    • tmp_name:臨時(shí)文件名
    • error:錯(cuò)誤標(biāo)號(hào)(0,123467)
    • size:大小,字節(jié)Byte
    <?php/*** 拿到一個(gè)上傳文件的信息* 判斷其合理和合法性,移動(dòng)到指定目標(biāo)** @param $file array 包含了5個(gè)上傳文件信息的數(shù)組** @return 成功,目標(biāo)文件名;失敗:false*/ function upload($file) {//判斷是否有錯(cuò)誤if($file['error'] != 0 ) {//文件上傳錯(cuò)誤switch ($file['error']) {case 1:echo '文件太大,超出了php.ini的限制';break;case 2:echo '文件太大,超出了表單內(nèi)的MAX_FILE_SIZE的限制';break;case 3:echo '文件沒(méi)有上傳完';break;case 4:echo '沒(méi)有上傳文件';break;case 6:case 7:echo '臨時(shí)文件夾錯(cuò)誤';break;}return false;}//判斷類型$allow_types = array('image/jpeg', 'image/png', 'image/gif');if(!in_array($file['type'], $allow_types)) {echo '類型不對(duì)';return false;}//判斷大小$max_size = 100000;//100kif($file['size'] > $max_size) {echo '文件過(guò)大';return false;}//處于安全性的考慮,判斷是否是一個(gè)真正的上傳文件:if( !is_uploaded_file($file['tmp_name'])) {echo '上傳文件可疑';return false;}//移動(dòng)//通常都會(huì)為目標(biāo)文件重啟名字//原則是:不重名,沒(méi)有特殊字符,有一定的意義!$dst_file = uniqid('upload_') . strrchr($file['name'], '.');if (move_uploaded_file($file['tmp_name'], $dst_file)) {//移動(dòng)成功,上傳完畢!return $dst_file;} else {//失敗echo '移動(dòng)失敗';return false;} }$result = upload($_FILES['goods_img']); echo '<hr>'; var_dump($result);

    代碼解釋
    唯一字符串 = uniqid(前綴)函數(shù)可以得到一個(gè)唯一的字符串!并且可以指定前綴:
    strrchr()。找到某個(gè)子字符串的最后出現(xiàn)位置,從該位置開(kāi)始,截取到字符串的最后!

    錯(cuò)誤類型

    • 文件太大,超過(guò)了php的對(duì)上傳文件的最大限制
      可以php的配置文件中修改:
      PHP對(duì)所有post數(shù)據(jù)的大小也有限制:所有的表單數(shù)據(jù)加起來(lái),不能超過(guò)!

    • 文件過(guò)大,超出了表單內(nèi)的一個(gè)隱藏元素的限制:
      該元素要出現(xiàn)在文件上傳域之前

    上傳文件工具類

    <?phpclass UploadTool {private $upload_dir;//上傳目錄private $max_size;private $allow_types;private $error_info;public function __construct($dir='', $size=2000000, $types=array()) {$this->upload_dir = $dir;$this->max_size = $size;$this->allow_types = empty($types)?array('image/jpeg', 'image/png'):$types;}public function __set($p_name, $p_value) {if (in_array($p_name, array('upload_dir', 'max_size', 'allow_types'))) {$this->$p_name = $p_value;}}public function __get($p_name) {if ($p_name == 'error_info') {return $this->$p_name;}}/*** 拿到一個(gè)上傳文件的信息* 判斷其合理和合法性,移動(dòng)到指定目標(biāo)** @param $file array 包含了5個(gè)上傳文件信息的數(shù)組* @param $prefix string 生成文件的前綴** @return 成功,目標(biāo)文件名;失敗:false*/function upload($file, $prefix='upload_') {//判斷是否有錯(cuò)誤if($file['error'] != 0 ) {//文件上傳錯(cuò)誤switch ($file['error']) {case 1:$this->error_info = '文件太大,超出了php.ini的限制';break;case 2:$this->error_info = '文件太大,超出了表單內(nèi)的MAX_FILE_SIZE的限制';break;case 3:$this->error_info = '文件沒(méi)有上傳完';break;case 4:$this->error_info = '沒(méi)有上傳文件';break;case 6:case 7:$this->error_info = '臨時(shí)文件夾錯(cuò)誤';break;}return false;}//判斷類型if(!in_array($file['type'], $this->allow_types)) {$this->error_info = '類型不對(duì)';return false;}//判斷大小if($file['size'] > $this->max_size) {$this->error_info = '文件過(guò)大';return false;}//處于安全性的考慮,判斷是否是一個(gè)真正的上傳文件:if( !is_uploaded_file($file['tmp_name'])) {$this->error_info = '上傳文件可疑';return false;}//移動(dòng)//通常都會(huì)為目標(biāo)文件重啟名字//原則是:不重名,沒(méi)有特殊字符,有一定的意義!$dst_file = uniqid($prefix) . strrchr($file['name'], '.');if (move_uploaded_file($file['tmp_name'], $this->upload_dir . $dst_file)) {//移動(dòng)成功,上傳完畢!return $dst_file;} else {//失敗$this->error_info = '移動(dòng)失敗';return false;}}}

    分子目錄保存

    目錄的創(chuàng)建,mkdir()!
    mkdir(目錄位置,是否遞歸創(chuàng)建);
    假設(shè)b不存在,則:
    mkdir(‘a(chǎn)/b/c’);失敗
    mkdir(‘a(chǎn)/b/c’, true);成功
    判斷目錄是否已經(jīng)存在,is_dir()判斷是否是一個(gè)目錄!
    bool = is_dir(目錄地址)

    劃分子目錄的原則!
    典型的原則,依據(jù)上傳時(shí)間完成子目錄的創(chuàng)建!
    按照小時(shí)創(chuàng)建子目錄!
    利用函數(shù) date()可以格式化時(shí)間。將一個(gè)時(shí)間戳,以易于理解的形式展示!
    date(‘格式’, 時(shí)間戳=time())

    tip:strtotime()將一個(gè)日期格式變成時(shí)間戳!

    //形成子目錄$sub_dir = date('YmdH');//判斷是否存在if(! is_dir($this->upload_dir . $sub_dir)) {//不存在則創(chuàng)建mkdir ($this->upload_dir . $sub_dir);}

    注意:這里會(huì)報(bào)date(): It is not safe to rely on the system’s timezone settings.
    解決方法:解決方法

    縮略圖

    基本過(guò)程
    采樣:在原圖上采樣(采集需要被復(fù)制的圖像區(qū)域)
    拷貝:將采集的圖樣信息,拷貝到某個(gè)畫(huà)布上(縮略圖)
    修改:修改大小,修改拷貝之后的大小區(qū)域結(jié)果

    需要一個(gè)php的gd函數(shù):
    imagecopyresampled();采樣拷貝,并修改大小

    需要的參數(shù)有哪些?
    兩個(gè)畫(huà)布:原圖畫(huà)布,與縮略圖畫(huà)布,dstimg,src_img
    采集區(qū)域控制:在原圖上的一個(gè)矩形區(qū)域!左上角坐標(biāo),寬,高!
    拷貝到縮略圖畫(huà)布上的位置與大小:在縮略圖畫(huà)布上矩形!坐標(biāo)和寬高!

    目標(biāo)在前,而原圖在后!先畫(huà)布,左上角坐標(biāo),寬高!
    imagecopyresampled(dstimg,src_img, dstx,dst_y, srcx,src_y, dstw,dst_h, srcw,src_h);

    實(shí)現(xiàn)步驟
    1創(chuàng)建原圖畫(huà)布和縮略圖畫(huà)布
    2采樣,拷貝,修改大小
    imagecopryresampled();
    3導(dǎo)出
    4銷毀

    <?php//創(chuàng)建原圖畫(huà)布和縮略圖畫(huà)布 $src_file = './src.jpg'; $src_img = imagecreatefromjpeg($src_file);//基于已有圖片創(chuàng)建 //縮略圖的大小應(yīng)該如何確定? $dst_img = imagecreatetruecolor(100, 100);//創(chuàng)建一個(gè)新的畫(huà)布//采樣,拷貝,修改大小 imagecopyresampled($dst_img, $src_img, 0, 0, 0, 0, 100, 100, 500, 375);//導(dǎo)出 header('Content-Type:image/jpeg'); imagejpeg($dst_img);//銷毀imagedestroy($dst_img); imagedestroy($src_img);

    等比例的縮略圖
    實(shí)現(xiàn)方式:
    一種:限定縮略圖的最大尺寸!
    二種:補(bǔ)白生成大小一致的縮略圖!

    <?php//已知條件 $max_w = 100;//范圍的最大的寬 $max_h = 100;//范圍的最大的高 $src_file = './src.jpg';//原始圖片//計(jì)算原圖的寬高 $src_info = getimagesize($src_file); $src_w = $src_info[0];//原圖寬 $src_h = $src_info[1];//原圖高//比較 寬之比 與 高之比 if($src_w/$max_w > $src_h/$max_h) {//寬應(yīng)該縮放的多$dst_w = $max_w;//縮略圖的寬為范圍的寬$dst_h = $src_h/$src_w * $dst_w;//按照原圖的寬高比將求出縮略圖高 } else {$dst_h = $max_h;$dst_w = $src_w/$src_h * $dst_h; }//創(chuàng)建畫(huà)布 $src_img = imagecreatefromjpeg($src_file);//基于已有圖片創(chuàng)建 //縮略圖的大小應(yīng)該如何確定? $dst_img = imagecreatetruecolor($dst_w, $dst_h);//創(chuàng)建一個(gè)新的畫(huà)布//采樣,拷貝,修改大小 imagecopyresampled($dst_img, $src_img, 0, 0, 0, 0, $dst_w, $dst_h, $src_w, $src_h);//導(dǎo)出 header('Content-Type:image/jpeg'); imagejpeg($dst_img);//銷毀 imagedestroy($dst_img); imagedestroy($src_img);

    圖片工具類

    <?phpclass ImageTool {/*** 生成縮略圖,補(bǔ)白** @param $src_file* @param $max_w;* @param $max_h;* * @return 縮略圖的圖片地址。失敗false!*/public function makeThumb($src_file, $max_w, $max_h) {//判斷原圖片是否存在if (! file_exists($src_file)) {$this->error_info = '源文件不存在';return false;}//計(jì)算原圖的寬高$src_info = getimagesize($src_file);$src_w = $src_info[0];//原圖寬$src_h = $src_info[1];//原圖高//在增加一個(gè)判斷!//如果原圖尺寸小于范圍(縮略圖尺寸)if($src_w < $max_w && $src_h < $max_h) {//則不用判斷,直接用原圖的$dst_w = $src_w;$dst_h = $src_h;} else {//比較 寬之比 與 高之比if($src_w/$max_w > $src_h/$max_h) {//寬應(yīng)該縮放的多$dst_w = $max_w;//縮略圖的寬為范圍的寬$dst_h = $src_h/$src_w * $dst_w;//按照原圖的寬高比將求出縮略圖高} else {$dst_h = $max_h;$dst_w = $src_w/$src_h * $dst_h;}}//創(chuàng)建畫(huà)布$src_img = imagecreatefromjpeg($src_file);//基于已有圖片創(chuàng)建//縮略圖的大小一致!$dst_img = imagecreatetruecolor($max_w, $max_h);//創(chuàng)建一個(gè)新的畫(huà)布//為縮略圖確定顏色,藍(lán)色$blue = imagecolorallocate($dst_img, 0x0, 0x0, 0xff);imagefill($dst_img, 0, 0, $blue);//填充//采樣,拷貝,修改大小。注意放置的位置!$dst_x=($max_w-$dst_w)/2;$dst_y=($max_h-$dst_h)/2;imagecopyresampled($dst_img, $src_img, $dst_x, $dst_y, 0, 0, $dst_w, $dst_h, $src_w, $src_h);//導(dǎo)出//取得原始文件的路徑與名字$src_dir = dirname($src_file);$src_basename = basename($src_file);$thumb_file=substr($src_basename, 0, strrpos($src_basename, '.')) . '_thumb' . strrchr($src_basename, '.');imagejpeg($dst_img, $src_dir . DS . $thumb_file);//銷毀imagedestroy($dst_img);imagedestroy($src_img);//返回return basename($src_dir) . '/' . $thumb_file;} }

    水印

    將一張圖片 合并 到另一張圖片上!

    采樣:從印章圖片上采集作為水印的圖片!
    拷貝:將采集到的顏色信息,拷貝到需要增加水印的圖片上!
    合并:需要確定合并位置(不能確定合并的大小),同時(shí)需要確定透明度!

    一個(gè)函數(shù):
    imagecopymerge()
    需要的參數(shù):
    兩個(gè)畫(huà)布:印章,待增加水印的畫(huà)布
    采集的區(qū)域:坐標(biāo)和寬高
    合并的位置:坐標(biāo)
    合并的透明度:透明值
    共 9 個(gè)參數(shù)!
    畫(huà)布,坐標(biāo),寬高,透明度;目標(biāo)在前!
    imagecopymerge(dstimg,stamp_img, dstx,dst_y, stampx,stamp_y, stampw,stamp_h, $pct )

    <?php$dst_file = './dst.jpg'; $stamp_file = './stamp.jpg';//畫(huà)布 $dst_img = imagecreatefromjpeg($dst_file); $stamp_img = imagecreatefromjpeg($stamp_file);//合并,拷貝 imagecopymerge($dst_img, $stamp_img, 0, 0, 0, 0, 128, 52, 70);// header('Content-Type: image/jpeg'); imagejpeg($dst_img);imagedestroy($dst_img); imagedestroy($stamp_img);

    總結(jié)

    以上是生活随笔為你收集整理的PHP之MVC项目实战(二)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。