2010-06-29 80 views
1

我目前使用的文件組件在vork框架上傳文件,我不斷收到此錯誤:上傳問題(拒絕)

警告:move_uploaded_file(/上傳)function.move-uploaded-文件]:無法打開流:許可拒絕在/ var/www/rto-vork/mvc/components /文件上線105

Warning:move_uploaded_file()[function.move-uploaded-file]:無法移動在/ var/WWW/RTO-vork/MVC /組件/上線文件105 串(32), 「無法將上傳的文件」 成功 '的/ tmp/php3WC6QP' 到 '/上傳'

我相信組件本身是好的,並上傳目錄已經chmoded 777

這裏的文件ID是正確

public function uploadFile($id, $destination, $imagesOnly = false) { 

    $return = false; 

    if (substr($_FILES[$id]['name'], 0, 1) == '.') { 

     $return = 'File names must not begin with a dot'; 

    } else { 

     $isInvalidUpload = $this->isInvalidUpload($id, $imagesOnly); 

     if ($isInvalidUpload) { 

      $return = $isInvalidUpload; 

     } else { 

      if (move_uploaded_file($_FILES[$id]['tmp_name'], $destination)) { 

       if (is_dir($destination)) { 

        if ($destination[-1] != '/' && $destination[-1] != '\\') { 

         $destination .= '/'; 

        } 

        $destination .= $_FILES[$id]['tmp_name']; 

       } 

       chmod($destination, 0777); 

      } else { 

       $return = 'Could not move the uploaded file'; 

      } 

     } 

    } 

    return $return; 

} 
+0

最後通過結合Mar B和Col Shrapnel給出的兩個修復程序來完成工作。多謝你們 :) – 2010-06-29 18:31:04

回答

2

你的代碼的缺陷:

public function uploadFile($id, $destination, $imagesOnly = false) { 
    ... 
    if (move_uploaded_file(...)) { 
     if (is_dir(...)) { 
      ... 
     } 
    } else { 
     $return = 'Could not move the uploaded file'; 
    } 
} 

與您通話uploadFile('somename', '/uploads')的方法,因此代碼首先嚐試上傳的文件移動到/uploads直接,但這是一個目錄。 move_uploaded_file()不像常規文件系統的「移動」命令,源和目標都必須是文件名。因此,您的初始移動嘗試失敗,它返回false,並且事件直接跳轉到「無法移動文件」返回調用。它甚至從來沒有試圖處理$目的地是一個目錄

你應該重組方法如下:

public function uploadFile(...) { 
    ... 
    // if $destination is a directory, handle that fact 
    if (is_dir($destination)) { 
     $destination .= '/' . $new_file_name; 
    } 
    // THEN try to move the file 
    if (move_uploaded_file($source, $destination)) { 
     return('worked'); 
    } else { 
     return('failed'); 
    } 
} 

另外要注意的是,雖然這是不可能的,是PHP分配的臨時文件名是保證隨着時間的推移是唯一的。完全可能的是,在某一點上,將再次生成相同的隨機名稱,並且您將覆蓋較早的上傳。您應該使用保證唯一的文件名,例如數據庫中的主鍵'id'字段或其他非重複數據源。

0

傳遞的上傳 代碼看起來像你對我正試圖移動目錄本身,或者你試圖寫一個目錄而不是文件。

Warning: move_uploaded_file**(/uploads)** [function.move-uploaded-file]: failed to open stream: Permission denied in /var/www/rto-vork/mvc/components/file on line 105 

驗證您使用的是生成的臨時文件名,並指定文件名以將文件另存爲。

0

錯誤消息非常明確:您無法寫入目錄/uploads
難怪 - 在unix系統上沒有人讓你寫入系統根目錄:)
這就是你的問題 - 你搞砸了web根目錄和文件系統根目錄。
一般來說,此代碼應幫助,如果剩下的代碼是正確的:

$destination = $_SERVER['DOCUMENT_ROOT'].$destination; 

,但我懷疑剩下的代碼是罰款
說,$destination .= $_FILES[$id]['tmp_name'];是相當無意義的代碼。
我想你最好找到自己的另一組件或寫自己的