2010-08-17 43 views
23

我使用下面的代碼,它成功地上傳我的本地機器上的文件。它在我的本地機器上顯示「成功上傳」。PHP move_uploaded_file()錯誤?

// Upload file 
$moved = move_uploaded_file($_FILES["file"]["tmp_name"], "images/" . "myFile.txt"); 

if($moved) { 
    echo "Successfully uploaded";   
} else { 
    echo "Not uploaded"; 
} 

但是,當我在我的在線服務器上使用此代碼,那麼它不上傳文件,只是顯示消息「未上傳」。

如何知道問題是什麼以及如何才能將實際問題顯示給用戶?

+1

你有Web服務器上的圖像文件夾?該文件夾是隻讀還是可以寫入也是? – gabe3886 2010-08-17 11:13:41

+0

任何PHP生成的錯誤消息?順便說一句,你不需要使用$移動,你可以把move_uploaded_file命令放入語句中。 – fabrik 2010-08-17 11:14:23

+0

@all:這是它沒有在服務器上顯示任何錯誤/警告的問題。 Images文件夾存在,我可以使用FileZilla在這個文件夾中上傳文件。 – Awan 2010-08-17 11:17:53

回答

33

檢查Web服務器有權限寫入「圖像/」目錄

+0

我可以使用FileZilla手動上傳文件夾中的文件,這意味着它有權限。任何其他可能性? – Awan 2010-08-17 11:19:23

+10

FileZilla不能證明Web服務器有權限。 Web服務器很可能會在不同的用戶下運行,而不是您自己。爲確保它具有權限,只需將權限設置爲777,然後進行測試。這應該證明它是否是許可問題或其他問題。 – 2010-08-17 11:33:12

+0

chown -R 777 yourdirectory – 2017-11-06 08:34:22

2

你會檢查文件上傳好嗎?也許你超出了max_post_size或max_upload_filesize。當使用FileZilla登錄時,您正在複製文件,當通過PHP wiritng上傳時,此文件來自運行apache的用戶(用於exaplme www-data),請嘗試將chmod 755用於圖像。

16

我怎麼能知道是什麼問題

容易。請參閱網絡服務器的錯誤日誌。

我怎樣才能得到實際的問題展示給用戶?

從來沒有做到這一點。
一個普通用戶不會發現這個錯誤。
惡意用戶不應該得到任何反饋,尤其是以非常有用的錯誤消息的形式。

只是以藉口顯示一頁。

如果您無法訪問服務器的錯誤日誌,則您的任務變得更加複雜。
有幾種方法可以聯繫錯誤消息。

要顯示屏幕上,你可以將這些行添加到代碼

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

或進行自定義錯誤日誌文件

ini_set('log_errors',1); 
ini_set('error_log','/absolute/path/tp/log_file'); 

還有一些其他方法錯誤消息。
但你必須明白,沒有實際的錯誤信息,你不能移動。很難盲目的在黑暗中

+0

嗯,在開發網站上顯示錯誤很好。將錯誤重定向到日誌文件並不總是可能的(例如在共享主機上)。 – 2010-08-17 11:57:24

+0

@Pekka我們正在談論一個現場的atm。而且,老實說,這種託管應該立即放棄。 – 2010-08-17 12:16:58

30

試試這個:

$upload_dir = $_SERVER['DOCUMENT_ROOT'] . "/images/"; 

if (is_dir($upload_dir) && is_writable($upload_dir)) { 
    // do upload logic here 
} else { 
    echo 'Upload directory is not writable, or does not exist.'; 
} 

這將立即舉報任何文件權限錯誤。

+0

沒有任何。而這種錯誤處理是無用的。 – 2010-08-17 12:17:35

+12

謹慎地闡述那些不瞭解的情況? – 2010-08-17 13:19:57

+1

說上傳目錄不可寫或不存在。它是如何解決的,請解釋一下? – 2016-10-27 07:27:07

1

或者運行suexec並且再也不需要更改權限。

5

move_uploaded_file()將返回:

  1. FALSE如果文件名無效
  2. FALSE並在錯誤日誌issue a warning如果Apache進程沒有讀/寫權限的源或目標目錄

PHP錯誤日誌

我的PHP錯誤日誌是在:/var/log/httpd/error_log擁有了這些錯誤:

警告:move_uploaded_file(圖片/ robot.jpg):未能打開流:權限在/ var/www/html等/ mysite的/ mohealth拒絕。上行PHP 78

警告:move_uploaded_file()以:無法在/var/www/html/mysite/mohealth.php移動 '/ TMP/phpsKD2Qm' 到 '圖像/ robot.jpg' 上線78

move_uploaded_file()嘗試將文件從臨時目錄移動到目標目錄。當apache進程嘗試移動文件時,它無法讀取臨時文件或寫入目標目錄。

  1. 找到哪個用戶正在運行Apache(Web服務器) 檢查該用戶是通過這個命令運行Apache服務:ps aux | grep httpd。第一列是用戶名。在臨時迪爾

  2. 檢查讀取權限:您可以通過在PHP頁面調用echo sys_get_tmp_dir();找到路徑到temp目錄。然後,在命令行上,看問題ls -ld /tmp/temporary-dir如果apache用戶可以訪問的目的地迪爾讀到這裏

  3. 檢查寫權限:問題ls -ld /var/www/html/destination-directory,看看apache用戶可以訪問這裏寫

  4. 使用chownchgrp

  5. 重啓Apache添加的權限,必要時使用sudo service httpd restart

+0

如何在Windows中檢查用戶? – Black 2015-11-26 17:49:38

+1

問題是通過關鍵字「source」解決的。看看:「move_uploaded_file()將返回FALSE,並在錯誤日誌中發出警告,如果apache進程不具有對」源「或目標目錄的讀/寫權限。」因此,將所有權限授予您的項目目錄是不夠的,並且應該授予源文件位置的所有權限。 – Hasan 2015-12-05 06:17:36

22

編輯的代碼如下:

// Upload file 
$moved = move_uploaded_file($_FILES["file"]["tmp_name"], "images/" . "myFile.txt"); 

if($moved) { 
    echo "Successfully uploaded";   
} else { 
    echo "Not uploaded because of error #".$_FILES["file"]["error"]; 
} 

它會給你下面的錯誤代碼中的一個值1到8:

UPLOAD_ERR_INI_SIZE = 值:1;上傳的文件超出了php.ini中的upload_max_filesize指令。

UPLOAD_ERR_FORM_SIZE = Value:2;上傳的文件超出了HTML表單中指定的MAX_FILE_SIZE指令。

UPLOAD_ERR_PARTIAL = Value:3;上傳的文件僅部分上傳。

UPLOAD_ERR_NO_FILE = Value:4;沒有文件上傳。

UPLOAD_ERR_NO_TMP_DIR = Value:6;缺少臨時文件夾。在PHP 5.0.3中引入。

UPLOAD_ERR_CANT_WRITE = Value:7;無法將文件寫入磁盤。在PHP 5.1.0中引入。

UPLOAD_ERR_EXTENSION = Value:8; PHP擴展停止了文件上傳。 PHP不提供確定哪個擴展導致文件上傳停止的方法;使用phpinfo()檢查加載的擴展列表可能會有所幫助。

0

請檢查您的form標記有此屬性:

enctype="multipart/form-data"

0
$uploadfile = $_SERVER['DOCUMENT_ROOT'].'/Thesis/images/'; 
$profic = uniqid(rand()).$_FILES["pic"]["name"]; 

if(is_uploaded_file($_FILES["pic"]["tmp_name"])) 
{ 
    $moved = move_uploaded_file($_FILES["pic"]["tmp_name"], $uploadfile.$profic); 
    if($moved) 
    { 
     echo "sucess"; 
    } 
    else 
    { 
     echo 'failed'; 
    } 
} 
0

在虛擬主機檢查disk quota

如果配額超過,move_uploaded_file返回錯誤。

PS:我一直在尋找這個很長的時間:)