国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

php 按照數(shù)組和步驟完成文件上傳

form表單提交的文件內(nèi)容指向了file.php。

我們?cè)趂ile.php中,通過(guò)PHP代碼,來(lái)處理上傳文件。

我們選擇一個(gè)名為圖片進(jìn)行上傳。假設(shè)圖片的名字為:psu.jpg,點(diǎn)擊上傳。

PHP為文件類數(shù)據(jù)準(zhǔn)備了一個(gè)專用的系統(tǒng)函數(shù)$_FILES,上傳文件的所有相關(guān)數(shù)據(jù),都保存在這個(gè)系統(tǒng)函數(shù)中。

在PHP文件中,我們打印 $_FILES ,來(lái)觀察這個(gè)數(shù)組的結(jié)構(gòu):

<?php
//var_dump()或print_r()
//打印變量的相關(guān)信息,將變量的信息詳細(xì)的展示出來(lái)
var_dump($_FILES);             
?>

打印出來(lái)的結(jié)果的數(shù)組結(jié)構(gòu)如下:

array (size=1)
    'file' => 
       array (size=5)
       //文件名
      'name' => string 'psu.jpg' (length=7) 
      //文件的mime類型
      'type' => string 'image/jpeg' (length=10)                    
      //緩存文件,上傳的圖片即保存在這里
      'tmp_name' => string 'E:\wamp\tmp\phpC32A.tmp' (length=23)
      //錯(cuò)誤碼,詳見(jiàn)上面錯(cuò)誤碼介紹
      'error' => int 0                                             
      //上傳的文件大小
      'size' => int 225824

得到了上面的數(shù)組結(jié)構(gòu)。

我們就可以開(kāi)始文件的處理過(guò)程了。

第一步,判斷錯(cuò)誤碼:

<?php
if($_FILES['file']['error'] > 0){
   switch ($_FILES['file']['error']) {    //錯(cuò)誤碼不為0,即文件上傳過(guò)程中出現(xiàn)了錯(cuò)誤
       case '1':
           echo '文件過(guò)大';
           break;
       case '2':
           echo '文件超出指定大小';
           break;
       case '3':
           echo '只有部分文件被上傳';
           break;
       case '4':
           echo '文件沒(méi)有被上傳';
           break;
       case '6':
           echo '找不到指定文件夾';
           break;
       case '7':
           echo '文件寫入失敗';
           break;
       default:
           echo "上傳出錯(cuò)<br/>";
   }
}else{
   //錯(cuò)誤碼為0,即上傳成功,可以進(jìn)行后續(xù)處理,處理流程見(jiàn)下文
}
?>

上面的代碼詳細(xì)的介紹了錯(cuò)誤碼和對(duì)應(yīng)的錯(cuò)誤,我們可以根據(jù)錯(cuò)誤碼,來(lái)生成準(zhǔn)確的錯(cuò)誤提示。

第二步,判斷文件是否超出大小。?在實(shí)際項(xiàng)目中,由于系統(tǒng)硬件的限制,以及存儲(chǔ)設(shè)備的限制,不可能讓用戶無(wú)限制的上傳文件,所以我們要對(duì)用戶上傳的文件大小進(jìn)行限制。定義一個(gè)合適的限制大小,能讓我們的應(yīng)用更穩(wěn)定的運(yùn)行。

<?php
//判斷錯(cuò)誤
if ($_FILES['file']['error'] > 0) {
    //有錯(cuò)誤可停止執(zhí)行
} else {
    //當(dāng)前上傳文件無(wú)誤,運(yùn)行本段代碼
    //判斷文件是否超出了指定的大小
    //單位為byte
    $MAX_FILE_SIZE = 100000;
    if ($_FILES['file']['size'] > $MAX_FILE_SIZE) {
        //判斷,如果上傳的文件,大小超出了我們給的限制范圍,退上傳并產(chǎn)生錯(cuò)誤提示
        exit("文件超出指定大小");
    }
}
?>

將我們指定的文件大小,定義為$MAX_FILE_SIZE,該變量的計(jì)數(shù)單位為byte,對(duì)應(yīng)上傳文件的 $_FILES['file']['size']大小。
示例代碼中,限制大小約為100K及以下的文件。

第三步,判斷文件的mime類型是否正確。

更多的時(shí)候,我們的文件上傳功能,都需要判斷用戶上傳的文件,是否符合要求,不可用的文件上傳以后,對(duì)于線上應(yīng)用的整體展示效果,會(huì)造成惡劣的影響。所以我們需要通過(guò)mime類型和后綴名,來(lái)判斷用戶上傳的文件是否符合要求。

下面的示例代碼中,我們假設(shè)當(dāng)前的項(xiàng)目需求為指定上傳圖片,要求上傳后綴名為GIF或者jpg的文件,當(dāng)用戶上傳不符合要求的文件時(shí),返回錯(cuò)誤提示。

<?php
/*判斷后綴名和MIME類型是否符合指定需求
例如:
當(dāng)前項(xiàng)目指定上傳后綴為.jpg或.gif的圖片,則$allowSuffix = array('jpg','gif');
*/
//定義允許的后綴名數(shù)組
$myImg = explode('.', $_FILES['file']['name']);
/*
explode() 將一個(gè)字符串用指定的字符切割,并返回一個(gè)數(shù)組,這里我們將文件名用'.''切割,結(jié)果存在$myImg中,文件的后綴名即為數(shù)組的最后一個(gè)值
*/
$myImgSuffix = array_pop($myImg);
/*
根據(jù)上傳文件名獲取文件的后綴名
使用in_array()函數(shù),判斷上傳文件是否符合要求
當(dāng)文件后綴名不在我們?cè)试S的范圍內(nèi)時(shí)退出上傳并返回錯(cuò)誤信息
*/
if(!in_array($myImgSuffix, $allowSuffix)){
    exit("文件后綴名不符");
}
/*
mime類型和文件后綴名的對(duì)應(yīng)關(guān)系,我們可以通過(guò)很多途徑查詢到,為了避免用戶自主修改文件后綴名造成文件無(wú)法使用。
mime類型也必須做出限制檢查mime類型,是為了防止上傳者直接修改文件后綴名
導(dǎo)致文件不可用或上傳的文件不符合要求。
*/
//數(shù)組內(nèi)容為允許上傳的mime類型
$allowMime = array(
    "image/jpg",
    "image/jpeg",
    "image/pjpeg",
    "image/gif"
);
if(!in_array($_FILES['file']['type'], $allowMime)){                      //判斷上傳文件的mime類型是否在允許的范圍內(nèi)
    exit('文件格式不正確,請(qǐng)檢查');
    //如果不在允許范圍內(nèi),退出上傳并返回錯(cuò)誤信息
}
?>

第四步,生成指定的路徑和文件名。

按照項(xiàng)目的文件安排,生成文件存儲(chǔ)路徑,為了避免文件名重復(fù)而產(chǎn)生的錯(cuò)誤,按照一定的格式,生成一個(gè)隨機(jī)文件名。

<?php
//指定上傳文件夾
$path = "upload/images/";
/*
根據(jù)當(dāng)前時(shí)間生成隨機(jī)文件名,本行代碼是使用當(dāng)前時(shí)間 + 隨機(jī)一個(gè)0-9的數(shù)字組合成文件名,后綴即為前面取到的文件后綴名
*/
$name = date('Y').date('m').date("d").date('H').date('i').date('s').rand(0,9).'.'.$myImgSuffix;
?>

第五步,判斷是否是上傳文件。

is_uploaded_file()函數(shù)是專用的函數(shù),來(lái)判斷目標(biāo)文件是否是上傳文件。

<?php

//使用is_uploaded_file()判斷是否是上傳文件,函數(shù)介紹見(jiàn)上文
if(is_uploaded_file($_FILEs['file']['tmp_name'])){    

}
?>

第六步,移動(dòng)文件到指定位置。

使用move_uploaded_file()函數(shù),將文件移動(dòng)到指定的位置,并命名。需要注意的是,Linux系統(tǒng)中對(duì)目標(biāo)目錄是否有權(quán)限及磁盤空間是否足夠,否則會(huì)導(dǎo)致上傳操作失敗。

<?php
/*
使用move_uploaded_file()移動(dòng)上傳文件至指定位置,第一個(gè)參數(shù)為上傳文件,第二個(gè)參數(shù)為我們?cè)谇懊嬷付ǖ纳蟼髀窂胶兔Q。
*/
if(move_uploaded_file($_FILEs['file']['tmp_name'], $path.$name)){
           //提示文件上傳成功
           echo "上傳成功";                                
       }else{
/*
文件移動(dòng)失敗,檢查磁盤是否有足夠的空間,或者linux類系統(tǒng)中文件夾是否有足夠的操作權(quán)限
*/
           echo '上傳失敗';                                                
       }
   }else{
       echo '不是上傳文件';
   }

}
?>

我們將這個(gè)文件片段整理成一整個(gè)文件:

<?php
if ($_FILES['file']['error'] > 0) {
   switch ($_FILES['file']['error']) {
       //錯(cuò)誤碼不為0,即文件上傳過(guò)程中出現(xiàn)了錯(cuò)誤
       case '1':
           echo '文件過(guò)大';
           break;
       case '2':
           echo '文件超出指定大小';
           break;
       case '3':
           echo '只有部分文件被上傳';
           break;
       case '4':
           echo '文件沒(méi)有被上傳';
           break;
       case '6':
           echo '找不到指定文件夾';
           break;
       case '7':
           echo '文件寫入失敗';
           break;
       default:
           echo "上傳出錯(cuò)<br/>";
   }
} else {

   $MAX_FILE_SIZE = 100000;
   if ($_FILES['file']['size'] > $MAX_FILE_SIZE) {
       exit("文件超出指定大小");

   }

   $allowSuffix = array(
       'jpg',
       'gif',
   );

   $myImg = explode('.', $_FILES['file']['name']);

   $myImgSuffix = array_pop($myImg);

   if (!in_array($myImgSuffix, $allowSuffix)) {
       exit("文件后綴名不符");
   }

   $allowMime = array(
       "image/jpg",
       "image/jpeg",
       "image/pjpeg",
       "image/gif",
   );

   if (!in_array($_FILES['file']['type'], $allowMime)) {
       exit('文件格式不正確,請(qǐng)檢查');
   }

   $path = "upload/images/";
   $name = date('Y') . date('m') . date("d") . date('H') . date('i') . date('s') . rand(0, 9) . '.' . $myImgSuffix;

   if (is_uploaded_file($_FILEs['file']['tmp_name'])) {

       if (move_uploaded_file($_FILEs['file']['tmp_name'], $path . $name)) {
           echo "上傳成功";
       } else {
           echo '上傳失敗';
       }

   } else {
       echo '不是上傳文件';
   }

}
?>


繼續(xù)學(xué)習(xí)
||
<?php if ($_FILES['file']['error'] > 0) { switch ($_FILES['file']['error']) { //錯(cuò)誤碼不為0,即文件上傳過(guò)程中出現(xiàn)了錯(cuò)誤 case '1': echo '文件過(guò)大'; break; case '2': echo '文件超出指定大小'; break; case '3': echo '只有部分文件被上傳'; break; case '4': echo '文件沒(méi)有被上傳'; break; case '6': echo '找不到指定文件夾'; break; case '7': echo '文件寫入失敗'; break; default: echo "上傳出錯(cuò)<br/>"; } } else { $MAX_FILE_SIZE = 100000; if ($_FILES['file']['size'] > $MAX_FILE_SIZE) { exit("文件超出指定大小"); } $allowSuffix = array( 'jpg', 'gif', ); $myImg = explode('.', $_FILES['file']['name']); $myImgSuffix = array_pop($myImg); if (!in_array($myImgSuffix, $allowSuffix)) { exit("文件后綴名不符"); } $allowMime = array( "image/jpg", "image/jpeg", "image/pjpeg", "image/gif", ); if (!in_array($_FILES['file']['type'], $allowMime)) { exit('文件格式不正確,請(qǐng)檢查'); } $path = "upload/images/"; $name = date('Y') . date('m') . date("d") . date('H') . date('i') . date('s') . rand(0, 9) . '.' . $myImgSuffix; if (is_uploaded_file($_FILEs['file']['tmp_name'])) { if (move_uploaded_file($_FILEs['file']['tmp_name'], $path . $name)) { echo "上傳成功"; } else { echo '上傳失敗'; } } else { echo '不是上傳文件'; } } ?>
提交重置代碼