首頁  >  文章  >  後端開發  >  PHP檔案上傳操作實例詳解

PHP檔案上傳操作實例詳解

高洛峰
高洛峰原創
2017-01-14 14:17:401232瀏覽

本文實例分析了PHP檔案上傳操作。分享給大家供大家參考,具體如下:

文件上傳

發生在瀏覽器向伺服器發出的請求中。

文件,對於瀏覽器來講,就是表單中的一個特殊類型的資料而已。

瀏覽器表單中的數據,兩種類型:

字串類型(位元組流編碼)

文件類型(二進位編碼),文件是表單資料中一部分

伺服器角度:

在接受瀏覽器請求時,處理好表單內的資料。根據資料類型不同使用不同處理方法:

字串類型,儲存在$_POST變數中(記憶體)

檔案型數據,儲存在上傳臨時目錄中

表單提交時,瀏覽器會預設的行為:

表單內的內容都是字串類型,即使添加了文件域,需要在form上增加屬性,告知瀏覽器上傳的不隻字串類型資料。 enctype="multipart/form-data"

<body>
  <form action="upload.php" method="post" enctype="multipart/form-data">
    <input type="file" name="file">
    </br>
    <input type="submit" value="submit">
  </form>
</body>

php伺服器在接收到文件類型的表單資料後,將文件儲存於臨時目錄(屬於臨時文件,腳本週期內有效)

; Temporary directory for HTTP uploaded files (will use system default if not
; specified).
; http://php.net/upload-tmp-dir
;upload_tmp_dir =

將臨時文件持久化存儲

move_uploaded_file(src_url,goa_url)

$_FILES,儲存了上傳檔案的資訊包括臨時地址

 PHP文件上传操作实例详解

錯誤類型:

0-1-2-3-4-6-7

0表示沒有錯誤

1表示檔案大於php的設定

; Maximum allowed size for uploaded files.
; http://php.net/upload-max-filesize
upload_max_filesize = 2M

2表示檔案大於表單設定max_file_size

<input type=&#39;hidden&#39; name=&#39;MAX_FILE_SIZE&#39; value=&#39;1024&#39;>

3表示檔案上傳不完整

4表示沒有上傳檔案

5表示邏輯上傳了0位元組的檔案(空白檔案)

找到臨時上傳目錄(權限不足)

7表示檔案寫入失敗(磁碟空間、權限)

php允許的最大上傳檔案數量

; Maximum number of files that can be uploaded via a single request
max_file_uploads = 20

post存在最大值限制

一旦超過,php就無法正常處理post與file值可能為空值

; Maximum size of POST data that PHP will accept.
; http://php.net/post-max-size
post_max_size = 8M

類型檢測中

後綴名與mime都是瀏覽器提供的,需要php的擴展fileinfo完成對文件資訊的檢查(函數過程與面向對象)

;extension=php_fileinfo .dll

$finfo = new Finfo(FILEINFO_MIME_TYPE);
$mine_type = $finfo->file($file[&#39;tmp_name&#39;]);

分子目錄儲存上傳檔案

原則:業務邏輯、檔案數量、時間

建立目錄mkdir()

檢查目錄is_dir()

<?php
upload($_FILES[&#39;file&#39;]);
function upload($file){
  if($file[&#39;error&#39;]!=0){
    return false;
  }
  //3M
  $max_size = 3145728;
  if($max_size<$file[&#39;size&#39;]){
    return false;
  }
  //设置一个后缀名与mime的映射关系
  $type_map = array(
    &#39;.jpeg&#39;=>array(&#39;image/jpeg&#39;,&#39;image/pjpeg&#39;),
    &#39;.jpg&#39;=>array(&#39;image/jpeg&#39;,&#39;image/pjpeg&#39;),
    &#39;.png&#39;=>array(&#39;image/png&#39;,&#39;image/x-png&#39;),
    &#39;.gif&#39;=>array(&#39;image/gif&#39;)
  );
  //后缀
  $allow_ext_list = array(&#39;.jpeg&#39;,&#39;.png&#39;,&#39;.jpg&#39;);
  $ext = strtolower(strrchr($file[&#39;name&#39;],&#39;.&#39;));
  if(!in_array($ext,$allow_ext_list)){
    echo &#39;不支持该图片格式&#39;;
    return false;
  }
  //MIME
  $allow_mime_list = array();
  foreach($allow_ext_list as $val){
    $allow_mime_list = array_merge($allow_mime_list,$type_map[$val]);
  }
  //浏览器提供信息坚持
  $allow_mime_list = array_unique($allow_mime_list);
  if(!in_array($file[&#39;type&#39;],$allow_mime_list)){
    echo &#39;不支持该图片格式&#39;;
    return false;
  }
  //php自身检查
  $file_mime = new Finfo(FILEINFO_MIME_TYPE);
  $mime = $file_mime->file($file[&#39;tmp_name&#39;]);
  if(!in_array($mime,$allow_mime_list)){
    echo &#39;不支持该图片格式&#39;;
    return false;
  }
  //目录存储
  $up_loadpath = &#39;./&#39;;
  $sub_dir = date(&#39;Ymdh&#39;);
  if(!is_dir($up_loadpath.$sub_dir)){
    mkdir($up_loadpath.$sub_dir);
  }
  $prefix = &#39;bee_&#39;;
  $name = uniqid($prefix,true).$ext;
  if(move_uploaded_file($file[&#39;tmp_name&#39;],$up_loadpath.$sub_dir.$name)){
    echo &#39;上传成功&#39;;
    return $name;
  }else{
    echo &#39;上传失败&#39;;
    return false;
  }
}

希望本文設計對大家PHP程式說明。

更多 PHP檔案上傳操作實例詳解相關文章請追蹤PHP中文網!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn