2017-07-25 61 views
1

在我的網站上,我允許用戶提交文件,並將它們發送到數據庫和我創建的文件目錄devFiles。它發送到數據庫罰款,但是當我發送到目錄,它永遠不會發送,我得到我的錯誤消息,我創建,看看它是否發送。我相信這個問題是與PHP - 上傳的文件沒有發送到文件目錄

if(is_file($dir.'/'.$file_name)==false){ 
     //code... 

     } 

但我想改變的條件,但沒有奏效。所以我想要做的就是發送提交到已創建的文件目錄的文件。這裏是我的代碼

PHP

$query = "INSERT INTO pack_screenshots(pack_id, file_name, file_tmp)VALUES(:packid, :file_name, :file_tmp)"; 
$stmtFileUpload = $handler->prepare($query); 
$errors = array(); 

foreach($_FILES['file']['tmp_name'] as $key => $error){ 

if ($error != UPLOAD_ERR_OK) { 
    $errors[] = $_FILES['file']['name'][$key] . ' was not uploaded.'; 
    continue; 
    } 

$file_tmp = file_get_contents($_FILES['file']['tmp_name'][$key]); 
$file_name = addslashes(trim($_FILES['file']['name'][$key])); 
    try{ 

$stmtFileUpload->bindParam(':packid', $packid, PDO::PARAM_STR); 
$stmtFileUpload->bindParam(':file_name', $file_name, PDO::PARAM_STR); 
$stmtFileUpload->bindParam(':file_tmp', $file_tmp, PDO::PARAM_STR); 

$dir = "devFiles"; 

if(is_dir($dir)==false){ 

    mkdir($dir, 0700); 
} 

if(is_file($dir.'/'.$file_name)==false){ 


    if(!move_uploaded_file($file_tmp,$dir.'/'.$file_name)){ 

       die("File didn't send!"); 
      } 

     }else{ 

     $_SESSION['invalid'] = true; 
     header("Location: developer_invalid.php"); 
     exit; 
     } 
     $stmtFileUpload->execute(); 
     $_SESSION['thankyou'] = true; 
     header("Location: developerUpload_thankyou.php"); 
     exit; 
     }catch(PDOException $e){ 

      $errors[] = $file_name . 'not saved in db.'; 
      echo $e->getMessage(); 
        } 
       } 
+1

檢查Apache的錯誤日誌,以獲得更詳細的錯誤信息 – Kai

+0

我該怎麼做呢?在linux上使用: – Jagr

+0

:'sudo vim/var/log/apache2/error.log' – Kai

回答

1

PHP文檔bool move_uploaded_file(字符串$文件名,字符串$目的地)

你做到:

move_uploaded_file($file_tmp,$dir.'/'.$file_name) 

move_uploaded_file是期待$ file_tmp是tmp文件的路徑,但是您使用了

$file_tmp = file_get_contents($_FILES['file']['tmp_name'][$key]); 

所以$ file_tmp不再是路徑,但內容是自我 所以要解決的上傳問題只是使用tmp文件路徑來代替。

if(!move_uploaded_file($_FILES['file']['tmp_name'][$key],$dir.'/'.$file_name)){ 

另外,您應該刪除文件名上的addslashes(),因爲它可能會創建意外的結果。相反,你可以使用這樣的消毒文件名:

$file_name = preg_replace("/[^a-z0-9\.]/", "_", strtolower($_FILES['file']['name'][$key])); 

你也應該考慮增加一個隨機數的文件名,這樣用戶就不會覆蓋具有相同名稱的其他用戶的文件:me.png能例如,對於化身是常見的。會更安全保存爲

$filename = strtotime("now")."_me.png"; 

最後一兩件事,使用is_file()也可能會導致在某些情況下的問題

注:因爲PHP的整數類型是有符號和很多平臺使用32位整數,一些文件系統函數可能會返回大於2GB的文件的意外結果。

使用file_exists(),而不是

+0

哇!感謝您的幫助:D您不會停止幫助我知道我很困惑:D我感謝您的所有努力,以幫助我找到正確的方式來做到這一點,你的技巧和竅門 – Jagr