2013-03-05 80 views
3

我有一個文件上傳頁面,我已經通過代碼並逐行逐行插入調試行,試圖找出造成這個問題的原因。在這個代碼塊某處出現該問題:PHP move_uploaded_file不起作用,但沒有產生錯誤

 $tmp_name = $_FILES['image_large']['tmp_name']; 
     chdir('..'.DIRECTORY_SEPARATOR.'photos'); 
     $name = getcwd().DIRECTORY_SEPARATOR.$_FILES['image_large']['name'];   
     $success = move_uploaded_file($tmp_name,$name); 
     $errormsg = "<p>source: {$tmp_name}</p><p>destination: {$name}</p>"; 
     $errormsg .= "<p>error: {$success}</p>"; 

$errormsg被打印在頁面上,並顯示以下結果:

source: C:\xampp\tmp\php4A14.tmp

destination: C:\xampp\htdocs\photos\fingerlakes1.jpg

error: 1

編輯:以上是讓人有些困惑,所以讓我澄清。 「錯誤:1」不引用$ _FILES ['image_large'] ['error']。這是一個布爾引用,指示move_uploaded_file是否起作用,因此得到1就是期望的結果。

該目的地是文件的正確位置。然而,當我檢查時,即使調試結果似乎表明計算機確信它已成功執行任務,但沒有生成「C:\ xampp \ htdocs \ photos \ fingerlakes1.jpg」文件。

我也確保該文件夾的寫權限已啓用(我在Windows 7上),但我認爲如果這是原因,$success將不會評估爲true。

編輯:我也嘗試過使用print_r($_FILES)檢查一切,它返回:

Array ([image_large] => Array ([name] => fingerlakes1.jpg [type] => image/jpeg [tmp_name] => C:\xampp\tmp\php5694.tmp [error] => 0 [size] => 497376) [image_thumb] => Array ([name] => fingerlakes1.jpg [type] => image/jpeg [tmp_name] => C:\xampp\tmp\php5695.tmp [error] => 0 [size] => 26228))

所以出現這些文件被正確上傳到tmp文件夾,至少。編輯2:有助於進一步的信息:我使用XAMPP,在管理員模式下運行XAMPP控制面板。我現在只是本地測試(換句話說,文件上傳應該僅僅是將文件從我的電腦的一部分複製到另一部分)。我進入目標文件夾「照片」和「縮略圖」,然後右鍵單擊 - >屬性 - >安全性,並確保列出的每個用戶都有寫入權限,只是爲了確保。此計算機上只有一個帳戶,但它以用戶和管理員身份兩次列出帳戶名稱,另外還有SYSTEM和另一個我忘記的帳戶。但是我給了他們所有的寫入權限以保證安全。

編輯3:根據要求,我嘗試在本帖頂部的第一個代碼框中替換一些代碼,以測試問題,用給出的文字路徑+文件名替換chdir和getcwd行。代碼目前看起來像這樣:

 $tmp_name = $_FILES['image_large']['tmp_name']; 
     //chdir('..'.DIRECTORY_SEPARATOR.'photos'); 
     //$name = getcwd().DIRECTORY_SEPARATOR.$_FILES['image_large']['name']; 
     $errormsg .= "<p>source: {$tmp_name}</p>"; 
     $errormsg .= "<p>destination: C:\\xampp\\htdocs\\photos\\fingerlakes1.jpg</p>"; 
     $success = move_uploaded_file($tmp_name,"C:\\xampp\\htdocs\\photos\\fingerlakes1.jpg"); 

我必須使用轉義序列作爲寫出目標字符串的反斜槓。我一開始忘了這樣做,並在頁面上顯示錯誤,顯示目標字符串被搞亂。我假設它之前嵌入變量$ tmp_name和$ name中的反斜槓沒有問題,因爲在這種情況下它沒有給出錯誤。

我在想,如果Windows對目錄分隔符使用反斜槓並且互聯網使用正斜槓,那麼......也許XAMPP期待正斜槓?我懷疑這是問題所在,因爲很多人在本地使用XAMPP來測試他們的代碼。

編輯4:發現問題的可能原因:我發現我的電腦上的每個文件夾都有勾選「只讀」的複選框。除了這個php問題,這並沒有阻止我在計算機上做任何事情,但我仍然使用Google搜索。發現這個: http://itexpertvoice.com/home/fixing-the-windows-7-read-only-folder-blues/

所以它似乎是一個Windows錯誤,但Windows通常忽略只讀設置。但是,我想知道move_uploaded_file的問題是否可能與此有關。我會嘗試在該頁面上的一些解決方案並回報。

編輯5:我開始強烈懷疑代碼實際上沒有任何問題,並且這是更多的Windows問題。我忽略的一件事是,我最初將所有站點文件放在另一個硬盤驅動器上,並安裝了XAMPP,並且文件上載在那裏工作,並且代碼從移動到新驅動器後沒有改變。唯一不同的是,那時候,我手動將圖像放入目標文件夾,然後使用文件上傳(實際上上傳它們以覆蓋自己),以便我可以使用文件上傳表單的其餘部分並寫入MySQL數據庫。這工作。我發現當前問題的原因之一是寫入數據庫的代碼被文件上傳問題阻塞。

所以我會嘗試其他一些事情。首先是測試我之前所做的事情......將文件放在我想要的位置,然後使用上載表單覆蓋文件,然後檢查是否能夠處理剩餘的文件php代碼寫入數據庫。

我要檢查的第二件事是將數據庫上傳到網絡主機,以及運行網站管理端所需的所有php/html文件。我有一種嘮叨的感覺,即使文件上傳表單在本地計算機上無法正常工作,它仍然可以正常工作。

我會在下班回到家時再試一次。

+0

我會假設它與你的'chdir'命令去做。你有沒有試過打印'$ name'變量,看看最終目錄的路徑是否正確?用圖像名稱$ _FILES ['image_large'] ['name']'來信任用戶也是非常不安全的。 – 2013-03-05 04:27:27

+0

同時在測試時,如果您沒有將錯誤報告設置爲最敏感,請將其設置爲:ini_set('display_errors',1); ini_set('error_reporting',8191);'查看所有錯誤。 – 2013-03-05 04:34:28

+0

如果可能的話,而不是chdir('..'。DIRECTORY_SEPARATOR.'photos'),寫一個物理目錄鏈接(沒有..)。 – Agilox 2013-03-05 05:01:43

回答

0

當您收到error code: 1這意味着maximum upload limit已被超過,它是由您的php.ini中的php配置定義的。有兩種方法可以提高限制:1,使用ini_set()修改php.inipost_max_size)或2。

上傳文件時使用if語句總是一個很好的做法,以便您可以根據需要進行適當的錯誤處理。

例如:

if(!move_uploaded_file($_FILES['image_large']['tmp_name'])){ 
    switch($_FILES['image_large']['error']){ 
     case 1: 
      echo "file to large"; 
      break; 
     case 2: 
      echo "file larger than set in form (MAX_FILE_SIZE)"; 
      break; 
     case 3: 
      echo "partial upload"; 
      break; 
     case 4: 
     default: 
      echo "file not uploaded (unknown)"; 
    } 
} 
+0

對不起,'1'代表'move_uploaded_file()'結果。至於'$ _FILES'錯誤,它是'0'。 – ariefbayu 2013-03-05 03:41:11

+0

錯誤是0,而不是1.對不起,我通過這種方式編寫調試線使它非常混亂。返回「errors:1」的部分實際上是$ success的值,它是一個布爾值,意味着它返回true。你可以在數組中看到我在編輯中發佈的$ _FILES,這兩個文件的錯誤都等於0. – 2013-03-05 03:41:44

+0

不用擔心,它不會引起混淆。如果您查看代碼,則清楚錯誤消息與什麼關聯 – 2013-03-05 04:01:38

相關問題