PHP上傳文件詳解 錯誤提示

首先在php.ini裏配置上載文件。有如下幾個重要的配置單:php

選項linux

默認值web

說明apache

post_max_size數組

8M瀏覽器

控制之後的POST請求的最大規模。必須大於upload_max_filesize選項值。安全

max_input_time服務器

60app

指定一個POST請求提交全部數據能夠花費的時間。以秒爲單位。在此時間以後結束數據提交。post

file_uploads

On

指出是否容許文件上傳。默認值爲on

upload_max_filesize

2M

控制PHP接受的最大文件規模。若是文件太大,PHP就寫入一個0字節的佔位符文件。

upload_tmp_dir

NULL

必須設置爲一個有效目錄。能夠將上傳的文件放在這裏等候處理。

 

而後,在表單HTML中設置文件上傳。須要注意三個地方:

  1. 1.       form表單提交方式設爲POST
  2. 2.       添加一個「file」類型的新的標記<input>
  3. 3.       enctype屬性添加到表單中,表示將使用新的multipart/form-data MIME類型。

 

當提交數據後,能夠經過$_FILES[‘filename’]來取得這個文件的信息。該信息以下:

$_FILES[‘filename’]

       [‘name’]  =>   文件名

       [‘type’]   =>   文件MIME類型。如image/jpeg, text/plain, application/octet-stream等。

       [‘tmp_name’] => 若是文件小於容許上傳文件大小,則該位置表示上傳的文件臨時存放路徑及臨時文件名,被放在upload_tmp_dir所指定的位置。

       [‘error’] =>    錯誤代碼。

       [‘size’] =>      文件大小。

其中error錯誤代碼可能的值以下表:

編碼

說明

UPLOAD_ERR_OK

0

文件成功上傳

UPLOAD_ERR_INI_SIZE

1

文件大小比php.iniupload_max_filesize指定值要大

UPLOAD_ERR_FORM_SIZE

2

文件的小比表單的MAX_FILE_SIZE指定的值大

UPLOAD_ERR_PARTIAL

3

文件上傳不完整(可能由於請求時間過長被終止)

UPLOAD_ERR_NO_FILE

4

沒有文件隨着這個請求上傳

UPLOAD_ERR_NO_TMP_DIR

6

php.ini中沒有指定臨時文件夾

只有當$_FILES[‘filename’][‘error’]的值爲0時,才應該繼續處理文件。

 

*************************************************************************************

 

在apache配置文件中設置php上傳臨時目錄

在服務器上配置webmail(好比我最喜歡的SquirrelMail)時,出於服務器安全考慮,通常在apache配置文件中做
php_admin_value open_basedir <path to web root>
的限制,防止php程序瀏覽整個硬盤,這個限制在使用虛擬主機的服務器上使用的更多。

然 而這個安全措施帶來一個隱含的限制,就是php的上傳臨時目錄(默認爲/tmp)沒法被php程序訪問,致使webmail中上傳附件時失敗,好比 SquirrelMail提示「Could not move/copy file. File Not Attached.」(「沒法移動/複製文件。文件須要被附在郵件上」)。

經過在apache配置文件中添加一個設置
php_admin_value upload_tmp_dir <path to temp dir>

讓php程序在上傳時使用指定的目錄做爲臨時文件目錄。
固然,要注意此目錄的權限設置要讓apache的運行用戶能寫入。

學習PHP不免老是會遇到一些莫名其妙的問題,就是搞不懂爲何,明明本身設置的都是正確的,但就是出問題,這不,今天我又遇到了一個這樣的問題,浪費了我好幾個小時,才弄明白是哪裏出了問題,真是鬱悶死了。
         今天直接找了一個上傳文件的php源代碼進行測試,老是顯示錯誤,提示爲錯誤代碼是2。我就在網上找了找資料。
<!--使用POST上傳文件示例:upload_file_post.php---------------------------->
<form enctype="multipart/form-data" action="receive_file_post.php" method="post">
您的大名: <input type=text name=user><br>
<input type="hidden" name="MAX_FILE_SIZE" value="30000">  <!--最大取值2147483647-->
上傳文件: <input name="userfile" type="file"><br><br>
<input type="submit" value="開始上傳">
</form>


其中,

  1. 請注意<form enctype="multipart/form-data"......>這是一個標籤,咱們要實現文件的上傳,必須指定爲multipart/form-data,不然服務器將不知道要幹什麼。
  2. 值得注意的是文件upload_file_post.php中表單選項 MAX_FILE_SIZE 的隱藏值域,經過設置其Value(值)能夠限制上載文件的大小。
  3. MAX_FILE_SIZE 的值只是對瀏覽器的一個建議,實際上它能夠被簡單的繞過。所以不要把對瀏覽器的限制寄但願於該值。實際上,PHP 設置中的上傳文件最大值,是不會失效的。可是最好仍是在表單中加上 MAX_FILE_SIZE,由於它能夠避免用戶在花時間等待上傳大文件以後才發現該文件太大了的麻煩。

<!--使用POST上傳文件示例:recieve_file_post.php---------------------------->
<?php
$upload_dir = './upload_files/';
if (!move_uploaded_file($_FILES['userfile']['tmp_name'],$upload_dir.$_FILES['userfile']['name']))
      echo "文件上傳失敗,錯誤信息:".$_FILES['userfile']['error']."<br>";
else
      echo "文件".$_FILES['userfile']['name']."上傳成功<br>";
?>

以上範例中 $_FILES 數組的內容以下所示。咱們假設文件上傳字段的名稱爲 userfile(名稱可隨意命名)

  • $_FILES['userfile']['name'] 客戶端機器文件的原名稱。
  • $_FILES['userfile']['type'] 文件的 MIME 類型,須要瀏覽器提供該信息的支持,例如「image/gif」。
  • $_FILES['userfile']['size'] 已上傳文件的大小,單位爲字節。
  • $_FILES['userfile']['tmp_name'] 文件被上傳後在服務端儲存的臨時文件名。
  • $_FILES['userfile']['error'] 和該文件上傳相關的錯誤代碼

   若是名爲file1.doc和file2.doc文件被上傳,則$_FILES['userfile']['name'] [0]將包含文件file1.doc的名稱,而$_FILES['userfile']['name'] [1]則將包含文件file.doc的名稱。

  1. 值:0; 沒有錯誤發生,文件上傳成功。
  2. 值:1; 上傳的文件超過了 php.ini 中 upload_max_filesize 選項限制的值。
  3. 值:2; 上傳文件的大小超過了 HTML 表單中 MAX_FILE_SIZE 選項指定的值。
  4. 值:3; 文件只有部分被上傳。
  5. 值:4; 沒有文件被上傳。

         我上傳的一首MP3,大概4M多,我看錯誤代碼是2,開來是個人HTML 表單中 MAX_FILE_SIZE 選項指定的值過小了,我看了一下,數值是30000,我又查了一下,這個設置的單位是字節,看來的確是這個問題了,把值設置大點不就OK了嗎,我一下改成 了10M,看來是沒問題了。而後進行測試,可又出現了錯誤代碼1。哎!怎麼還有問題啊。不過不要緊,一步步來嗎。
          不就是錯誤代碼1嗎,哦,原來是upload_max_filesize限制值過小了,二話不說,改成10M了。哈哈。。。。。。測試,暈,仍是不行。我就繼續找php.ini設置的資料。看到下面的東西:
PHP上傳文件涉及到的參數PHP默認的上傳限定是最大2M,想上傳超過此設定的文件,須要調整PHP、apache等的一些參數. 下面,咱們簡要介紹一下PHP文件上傳涉及到的一些參數:

  • file_uploads

是否容許經過HTTP上傳文件的開關,默認爲ON便是開

  • upload_tmp_dir

upload_tmp_dir用來講明PHP上傳的文件放置的臨時目錄,要想上傳文件,得保證服務器沒有關閉臨時文件和有對文件夾的寫權限,若是未指定則PHP使用系統默認值

  • upload_max_filesize

容許上傳文件大小的最大值,默認爲2M

  • post_max_size

控制在採用POST方法進行一次表單提交中PHP所可以接收的最大數據量。若是但願使用PHP文件上傳功能,則須要將此值改成比upload_max_filesize要大

  • max_input_time

以秒爲單位對經過POST、GET以及PUT方式接收數據時間進行限制。若是應用程序所運行環境處在低速鏈路上,則須要增長此值以適應接收數據所需的更多時間

  • memory_limit

爲了不正在運行的腳本大量使用系統可用內存,PHP容許定義內存使用限額。經過memory_limit變量來指定單個腳本程序可使用的最大內存容量變量memory_limit的值應當適當大於post_max_size的值

  • max_execution_time

max_execution_time 設置了在強制終止腳本前PHP等待腳本執行完畢的時間,此時間以秒計算。當腳本進入了一個無限循環狀態時此變量很是有用。然而,當存在一個須要很長時間完 成的合法活動時(例如上傳大型文件),這項功能也會致使操做失敗。在這樣的狀況下必須考慮將此變量值增長,以免PHP在腳本正在執行某些重要過程的時候 將腳本關閉

  • 對於linux主機,可能在/etc/httpd/conf.d/access.conf/下面裏面還有php.conf 文件,這個文件可能會解決一些系統的文件大小限制問題

            我就照着上邊的,把限制都改得超大,這回應該沒有問題了吧,都設置好了。測試一下嘍。真鬱悶,仍是提示錯誤代碼1。不對啊,我設置的都很大啊,不會有問題的。怎麼回事呢。
         算了,呆會再研究,先讓同窗玩吧,去買飯了,否則呆會餐廳沒飯了,呵呵。。肚子餓了!
         回來了,繼續研究那個煩人的問題。我上傳個小文件嗎。上傳個WORD文檔,才兩百多K,哦耶!成功一次。弄個1M多的壓縮包,又成功了,再試試我那歌曲 了。哎!仍是不成功。看了看那首歌有5M多,上傳個小店的歌曲了。我找了個2M多的歌曲上傳,仍是不成功。再試個不到2M的歌吧,竟然成功了。看來是不能 上傳大於2M的東西了。奇怪啊,不大對啊,我設置的限制是10M 啊,遠遠大於了。難道是我設置沒成功。我又看了看設置,沒有問題的。
      。。。。。。。。。。。。
      我不停的想啊,累死了,2M........這不就是php.ini設置上傳限制的默認值嗎,我改了怎麼沒有成功呢。哦??多是服務器得重啓一下,之前 也常常遇到非重啓服務器才能解決問題的狀況。因而我就重啓的Apache(我用的是這個),再試試了。成功了!!此次真的是搞定了。
       之前在配置PHP環境的時候,也遇到過相似的狀況,感受配置的環境沒有問題,可就是測試不成功,通常都是須要重啓Apache等服務器了。因此呢,之後,已更改相似php.ini等文件後,必定要記得重啓服務器。

轉自:http://dxnumber.blog.163.com/blog/static/173757526201331994835335/

相關文章
相關標籤/搜索