2017-05-28 164 views
0

在LEMP(Linux CentOS,Nginx,MariaDB,PHP)服務器上,/etc/php.ini文件具有以下內容。PHP move_uploaded_file失敗,沒有錯誤

file_uploads = on 
upload_tmp_dir = /tmp 

Stage1.html具有以下的標記,其用於選擇一個圖像文件,並且將圖像發佈到Stage2.php。

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

Stage2.php具有以下內容。

<?php 
    $original_name = $_FILES["upload"]["name"]; 
    $temporary_name = $_FILES["upload"]["tmp_name"]; 
    $target = "/var/www/html/images/" . $original_name; 

    if(move_uploaded_file($temporary_name, $target)) {echo "Success";} 
    else{echo "Failed";} 
?> 

正確設置原始文件,臨時文件和目標。但是,返回失敗

enter image description here

加入以下Stage2.php返回0引述PHP Manual,0表示「沒有錯誤,成功上傳的文件。」

$_FILES["upload"]["error"]; 

將以下內容添加到Stage2.php中不會顯示任何錯誤。這導致我懷疑PHP認爲一切正常,並且問題可能是CentOS或Nginx的一些問題。這是合乎邏輯的假設嗎?

ini_set('display_errors', 1); 
ini_set('display_startup_errors', 1); 
error_reporting(E_ALL); 

要進行調試,在CentOS的,我給自己定的/ tmp的權限和/ var/www/html等/圖像爲777(讀,寫,執行爲大家)。仍然沒有錯誤返回。

enter image description here

+0

檢查您的max_upload_file_size –

+0

'upload_max_filesize'爲2 MB,上傳的文件爲40 KB。 – JeremyCanfield

+0

if(move_uploaded_file($ original_name,$ target))試一次,並檢查@JeremyCanfield – Exprator

回答

1

萬一別人遇到這個問題,我想和大家分享我發現的。我能夠得出結論,這是Linux CentOS的一個問題,而不是PHP問題。

通常,open_basedir將被設置爲/var/www/etc/php.ini。在這種情況下,upload_tmp_dir必須位於/var/www以下的某處。我將upload_tmp_dir設置爲/var/www/html/images/tmp

upload_tmp_dir = /var/www/html/images/tmp 

我然後設置臨時上傳目錄的權限是755

[[email protected] ~]# chmod 755 /var/www/html/uploads/tmp 

然後我用下面的PHP,以確定哪些用戶使用PHP上傳文件。在我的情況下,用戶是apache

<?php 
    echo exec('whoami'); 
?> 

一旦我確定用戶是apache,我將臨時上傳目錄的所有者設置爲apache。

[[email protected] ~]# chown apache:root /var/www/html/uploads/tmp 

最後,我只好臨時和永久上傳目錄的SELinux值設置爲httpd_sys_rw_content_t

[[email protected] ~]# chcon --type httpd_sys_rw_content_t /var/www/html/uploads 
[[email protected] ~]# chcon --type httpd_sys_rw_content_t /var/www/html/uploads/tmp 

做完這些事情後,我就可以使用PHP上傳文件。