首先在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中設置文件上傳。須要注意三個地方:
當提交數據後,能夠經過$_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.ini中upload_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>
其中,
<!--使用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(名稱可隨意命名)
若是名爲file1.doc和file2.doc文件被上傳,則$_FILES['userfile']['name'] [0]將包含文件file1.doc的名稱,而$_FILES['userfile']['name'] [1]則將包含文件file.doc的名稱。
我上傳的一首MP3,大概4M多,我看錯誤代碼是2,開來是個人HTML 表單中 MAX_FILE_SIZE 選項指定的值過小了,我看了一下,數值是30000,我又查了一下,這個設置的單位是字節,看來的確是這個問題了,把值設置大點不就OK了嗎,我一下改成 了10M,看來是沒問題了。而後進行測試,可又出現了錯誤代碼1。哎!怎麼還有問題啊。不過不要緊,一步步來嗎。
不就是錯誤代碼1嗎,哦,原來是upload_max_filesize限制值過小了,二話不說,改成10M了。哈哈。。。。。。測試,暈,仍是不行。我就繼續找php.ini設置的資料。看到下面的東西:
PHP上傳文件涉及到的參數PHP默認的上傳限定是最大2M,想上傳超過此設定的文件,須要調整PHP、apache等的一些參數. 下面,咱們簡要介紹一下PHP文件上傳涉及到的一些參數:
是否容許經過HTTP上傳文件的開關,默認爲ON便是開
upload_tmp_dir用來講明PHP上傳的文件放置的臨時目錄,要想上傳文件,得保證服務器沒有關閉臨時文件和有對文件夾的寫權限,若是未指定則PHP使用系統默認值
容許上傳文件大小的最大值,默認爲2M
控制在採用POST方法進行一次表單提交中PHP所可以接收的最大數據量。若是但願使用PHP文件上傳功能,則須要將此值改成比upload_max_filesize要大
以秒爲單位對經過POST、GET以及PUT方式接收數據時間進行限制。若是應用程序所運行環境處在低速鏈路上,則須要增長此值以適應接收數據所需的更多時間
爲了不正在運行的腳本大量使用系統可用內存,PHP容許定義內存使用限額。經過memory_limit變量來指定單個腳本程序可使用的最大內存容量變量memory_limit的值應當適當大於post_max_size的值
max_execution_time 設置了在強制終止腳本前PHP等待腳本執行完畢的時間,此時間以秒計算。當腳本進入了一個無限循環狀態時此變量很是有用。然而,當存在一個須要很長時間完 成的合法活動時(例如上傳大型文件),這項功能也會致使操做失敗。在這樣的狀況下必須考慮將此變量值增長,以免PHP在腳本正在執行某些重要過程的時候 將腳本關閉
我就照着上邊的,把限制都改得超大,這回應該沒有問題了吧,都設置好了。測試一下嘍。真鬱悶,仍是提示錯誤代碼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/