11.文件上傳和下載

文件上傳

客戶端上傳設置

  • 在B/S程序中文件上傳已經(jīng)成為一個常用功能。其目的是客戶可以通過瀏覽器(Browser)將文件上傳到服務器(Server)上的指定目錄。

  • PHP中文件上傳的基礎知識:
    客戶端form表單
    服務器端對上傳文件的操作

客戶端文件上傳的form表單:
<html>
    <head><title>文件上傳</title></head>
    <body>
        <form action="upload.php"  method="post"  enctype="multipart/form-data">
            <input type="hidden" name="MAX_FILE_SIZE" value="1000000">
            選擇文件:<input type="file" name="myfile">
            <input type="submit" value="上傳文件">
        </form>
    </body>
</html>

注意幾個特征屬性:

  • POST方法:
    表單最常用的功能,向目標頁面?zhèn)鬟f變量,我們在上傳文件的時候,會在表單中設置相應的屬性,來完成文件的傳遞

  • enctype="multipart/form-data"
    這樣服務器就會知道,我們要傳遞一個文件,這樣服務器可以知道上載的文件帶有常規(guī)的表單信息。

  • MAX_FILE_SIZE
    此字段必須在文件輸入字段之前,控制最大的傳遞文件的大小(字節(jié))

  • 設置瀏覽器文件輸入瀏覽按鈕

<input type="file" name="userfile">

在服務器端通過PHP處理上傳

上傳文件的接收和處理是通過PHP腳本來處理的,具體需要通過以下三個方面信息:

  • 設置PHP配置文件中的指令:用于精細地調節(jié)PHP的文件上傳功能。
PHP配置文件中與文件上傳有關的選項:
指令名 默認值 功能描述
file_uploads ON 是否開啟文件上傳
upload_max_filesize 2M 限制PHP處理上傳文件大小的最大值,此值必須小于post_max_size
post_max_size 8M 限制通過POST方法可以接受信息的最大值,也就是整個POST請求的提交值。此值必須大于upload_max_filesize
upload_tmp_dir NULL 上傳文件存放的臨時路徑,可以是絕對路徑。默認NULL則使用系統(tǒng)的臨時目錄
  • $_FILES多維數(shù)組:用于存儲各種與上傳文件有關的信息,其他數(shù)據(jù)還是使用$_POST獲取。
超級全局數(shù)組$_FILES
  • $_FILES["myfile"]["name"]中的值是:
    客戶端文件系統(tǒng)的文件的名稱
  • $_FILES["myfile"]["type"]中的值是:
    客戶端傳遞的文件的類型
  • $_FILES["myfile"]["size"]中的值是:
    文件的字節(jié)的大小
  • $_FILES["myfile"]["tmp_name"]中的值是:
    文件被上傳后在服務器存儲的臨時全路徑
  • $_FILES["myfile"]["error"]中的值是:
    文件上傳的錯誤代碼-php 4.2以后增加的功能
存儲在$_FILES["myfile"]["error"]中的值

伴隨文件上傳時產(chǎn)生的錯誤信息代碼是在PHP4.2.0版本中引入的,具體如下:

  • 值為0:表示沒有發(fā)生任何錯誤。對應常量的值 UPLOAD_ERR_OK

  • 值為1:表示上傳文件的大小超出了約定值。文件大小的最大值是在PHP配置文件中指定的,該指令是:upload_max_filesize。對應常量的值 UPLOAD_ERR_INI_SIZE

  • 值為2:表示上傳文件大小超出了HTML表單隱藏域屬性的MAX_FILE_SIZE元素所指定的最大值。對應常量的值 UPLOAD_ERR_FORM_SIZE

  • 值為3:表示文件只被部分上傳。對應常量的值 UPLOAD_ERR_PARTIAL

  • 值為4:表示沒有上傳任何文件。對應常量的值 UPLOAD_ERR_NO_FILE

  • 值為6:表示找不到臨時文件夾。PHP 4.3.10 和 PHP 5.0.3 引進。對應常量的值 UPLOAD_ERR_NO_TMP_DIR

  • 值為7:表示文件寫入失敗。PHP 5.1.0 引進。對應常量的值 UPLOAD_ERR_CANT_WRITE

常見的數(shù)據(jù)格式

文件類型 MIME類型
圖片文件 image/gif,image/jpg,image/jpeg,image/png,image/x-png
純文本和HTML text/txt,text/plain,text/html
二進制文件 application/octet-stream
音頻格式 audio/basic
視頻格式 video/mpeg
PHP的文件上傳處理函數(shù):用于上傳文件的后續(xù)處理。

上傳成功的文件會被放置到服務器端臨時目錄下,文件名是隨機生成的臨時文件名。

注意:該文件在程序執(zhí)行完后將自動被刪除掉。在刪除前可以像本地文件一樣操作。

文件上傳處理函數(shù):

  • is_uploaded_file —判斷文件是否是通過 HTTP POST 上傳的
    格式:bool is_uploaded_file ( string $filename )
  • move_uploaded_file — 將上傳的文件移動到新位置
    格式:bool move_uploaded_file ( string $filename , string $destination )

注意:如果目標文件已經(jīng)存在,將會被覆蓋。

上傳代碼示例

<?php
    $allowtype = array("gif", "png", "jpg");   //設置充許上傳的類型為gif, png和jpg
    $size = 1000000;                           //設置充許大小為1M(1000000字節(jié))以內(nèi)的文件
    $path = "./uploads";                       //設置上傳后保存文件的路徑
    
    //1. 判斷文件是否可以成功上傳到服務器,$_FILES['myfile']['error'] 為0表示上傳成功
    if($_FILES['myfile']['error'] > 0) {    
        echo '上傳錯誤: ';
        switch ($_FILES['myfile']['error']) {
            case 1:  die('上傳文件大小超出了PHP配置中的約定值:upload_max_filesize');  
            case 2:  die('上傳文件大小超出了表單中的約定值:MAX_FILE_SIZE');  
            case 3:  die('文件只被部分上載'); 
            case 4:  die('沒有上傳任何文件'); 
            case 6:  die('找不到臨時文件夾');
            case 7:  die('文件寫入失敗');
            default: die('末知錯誤');
        }
    } 
    //2. 判斷上傳的文件是否為充許的文件類型,通過文件的后綴名
    $hz = array_pop(explode(".", $_FILES['myfile']['name']));
    //3.通過判斷文件的后綴方式,來決定文件是否是充許上傳的文件類型
    if(!in_array($hz, $allowtype)) {
        die("這個后綴是<b>{$hz}</b>,不是充許的文件類型!");
    }
    //4. 判斷上傳的文件是否為充許大小
    if($_FILES['myfile']['size'] > $size ) {
        die("超過了充許的<b>{$size}</b>字節(jié)大小");
    }
    //5. 為了系統(tǒng)安全,也為了同名文件不會被覆蓋,上傳后將文件名使用系統(tǒng)定義
    $filename = date("YmdHis").rand(100,999).".".$hz;
    //6. 判斷是否為上傳文件
    if (is_uploaded_file($_FILES['myfile']['tmp_name'])) { 
        if (!move_uploaded_file($_FILES['myfile']['tmp_name'], $path.'/'.$filename)) {  
            die('問題: 不能將文件移動到指定目錄。');
        }
    }else{
        die("問題: 上傳文件{$_FILES['myfile']['name']}不是一個合法文件: ");
    }
    //7. 如果文件上傳成功則輸出
    echo "文件{$upfile}上傳成功,保存在{$path}中,大小為{$_FILES['myfile']['size']}字節(jié)";   
?>

多文件上傳

當需要上傳多個文件的情況,有兩種實現(xiàn)的解決方法:

  • 使用不同的表單元素
<input type="file" name="file_a">
<input type="file" name="file_b">
<input type="file" name="file_b">
  • 使用數(shù)組格式的表單元素
<input type="file" name="file[]">
<input type="file" name="file[]">
<input type="file" name="file[]">

文件下載

<?php
 //文件下載練習
$filename="./upload/aa.png";
$basename=pathinfo($filename);
header("Content-Type: image/png"); //指定下載文件類型的
header("Content-Disposition:attachment;filename=".                      $basename["basename"]);
//指定下載文件的描述信息
header("Content-Length:".filesize($filename));  //指定文件大小的
readfile($filename);//將內(nèi)容輸出,以便下載。
?>
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容