2011-12-04 34 views
0

我正在編寫一個代碼,可以讓我上傳文件。代碼是將文件轉換爲全部小寫。檢查以確保文件名尚未被插入到數據庫中,並且如果用戶上傳.png或.jpg文件,請將圖像調整爲縮略圖並保留這兩者的副本縮略圖和常規大小的圖像放在名爲uploads的文件夾中。我仍然有點困惑,因爲有些事情我已經完成了。我不知道如果我可能已經做了幾天,或者什麼都沒做,但我什麼也看不見。不僅如此,我仍然是一名新手。關於使用數據庫在php中上傳文件

這裏是我的代碼:

$aryImages=array("image/jpeg","image/png"); 
$aryDocs=array("application/msword","application/pdf","video/x-msvideo"); 
$filename=filenameSafe($_FILES['upload']['name']); 
$fileType=$_FILES["upload"]["type"]; 
if (in_array($_FILES["upload"]["type"],$aryImages)){ 
    createThumb($fileType,$_FILES['upload']['tmp_name'],$filename,100,100); 
} 
elseif (in_array($_FILES["upload"]["type"],$aryDocs)){ 
    move_uploaded_file($_FILES['upload']['tmp_name'], 
"../imagefolder/".$filename); 


$aryColumns=array("sessionID"=>$curSess,"fileName"=>$filename,"fileType"=>$fileType,"thumbFileName"=>$thumbFilename,"dateCreated"=>date('Y-m-d H:i:s')); 
    dbInsert($filename,$aryColumns,$_FILES["upload"]["type"]); 
} 


    else{ 

    echo "File Uploaded"; 
    } 
} 



function createThumb($type,$tmpname,$filename,$new_w,$new_h){ 
    $thumbFilename="tmb-".$filename; 
    if (is_numeric(strpos($type,"jpeg"))){ 
     $src_img=imagecreatefromjpeg($tmpname); 
    } 
    if (is_numeric(strpos($type,"png"))){ 
     $src_img=imagecreatefrompng($tmpname); 
    } 
    $old_x=imageSX($src_img); 
    $old_y=imageSY($src_img); 
    if ($old_x > $old_y) { 
     $thumb_w=$new_w; 
     $thumb_h=$old_y*($new_h/$old_x); 
    } 
    if ($old_x < $old_y) { 
     $thumb_w=$old_x*($new_w/$old_y); 
     $thumb_h=$new_h; 
    } 
    if ($old_x == $old_y) { 
     $thumb_w=$new_w; 
     $thumb_h=$new_h; 
    } 

    $dst_img=imagecreatetruecolor($thumb_w,$thumb_h); 
    imagecopyresampled($dst_img,$src_img,0,0,0,0,$thumb_w,$thumb_h,$old_x,$old_y); 
    if (is_numeric(strpos($type,"jpeg"))){ 
     imagejpeg($dst_img,"../upload/".$thumbFilename); 
     imagejpeg($src_img,"../upload/".$filename); 
    } 
    if (is_numeric(strpos($type,"png"))){ 
     imagepng($dst_img,"../upload/".$thumbFilename); 
     imagepng($src_img,"../upload/".$filename); 
    } 
    imagedestroy($dst_img); 
    imagedestroy($src_img); 
    dbInsert($filename,$thumbFilename,$type); 
} 


function filenameSafe($filename) { 
    $temp = $filename; 
    // Lower case 
    $temp = strtolower($temp); 
    // Replace spaces with a ’_’ 
    $temp = str_replace(" ", "_", $temp); 
    // Loop through string 
    $result = ""; 
    for ($i=0; $i<strlen($temp); $i++) { 
     if (preg_match('([0-9]|[a-z]|_|.)', $temp[$i])) { 
      $result = $result.$temp[$i]; 
     } 
    } 



    dbConnect(); 
    $SQL="SELECT fileID FROM upload WHERE fileName='".$result."'"; 
    //echo $SQL; 
    $rs=mysql_query($SQL); 
    echo mysql_num_rows($rs); 
    if(mysql_num_rows($rs)!=0){ 
     $extension=strrchr($result,'.'); 
     $result=str_replace($extension,time(),$result); 
     $result=$result.$extension; 
    } 
    return $result; 
} 




function dbInsert($filename,$thumbFilename,$type){ 
    dbConnect(); 
    $SQL="INSERT Into tblFile (fileName,thumbFileName,fileType) values('".$filename."','".$thumbFilename."','".$type."')"; 
    echo $query; 
    exit; 
    mysql_query($SQL); 


} 

我想這是循環的地方,我只是不能抓住它。當我點擊瀏覽按鈕後上傳按鈕頁面上沒有任何圖片或任何東西。我沒有得到任何錯誤或沒有任何東西。有人能幫助我嗎?如果我嘗試將一些代碼放出,它將開始給我錯誤和致命錯誤。感謝您的期待。

+0

你可以使你的代碼多一點額外的空間可讀。同時啓用'error_reporting(E_ALL);' – mario

+0

你能告訴我們具體的錯誤信息嗎? – rdlowrey

+0

嗯,我沒有代碼丟失的地方。 – sn1984

回答

0

您在這裏有幾個問題,所以我現在只專注於一個領域,希望能夠幫助您在將來編寫更好的代碼。

您的filenameSafe()功能非常低效。在循環內使用一個字符串的每個字符的正則表達式就像用一把用炸藥綁在手柄上的大錘打破一個雞蛋。另外,如果您的目標是在將數據保存到數據庫之前對數據進行清理,那麼在對數據庫進行查詢之前,您應該在數據上使用mysql_real_escape_string()

此外,通過簡單地查找文件名中第一次出現的句點以確定擴展名的起始位置是可疑的......如果多個句點以某種方式將其放入文件名中,該怎麼辦?相反,請嘗試使用pathinfo()獲取擴展名。

最後,我假設通過附加當前時間戳記,您試圖避免文件系統中的文件名衝突。這不是一個適當的解決方案,因爲兩個文件很可能在相同的時間保存。雖然有關哈希這樣的主題的整本書,但爲了時間的緣故,我只是說,通過在文件名上放置一個快速的md5()uniqid()可以更好地爲您服務。

那麼,如何更好地處理代碼的特定部分的例子:

function filenameSafe($filename) 
{ 
    // Lower case 
    $filename = strtolower($filename); 

    // get extension 
    $ext = pathinfo($filename, PATHINFO_EXTENSION); 

    // Replace spaces with a ’_’ 
    $filename = str_replace(" ", "_", $filename); 

    // Replace non-alphanumerics (except underscores) 
    $filename = preg_replace('/\W/', '', $filename); 

    // append the timestamp 
    $filename = $filename . time(); 

    // create an md5 hash 
    $result = md5($filename); 

    // ensure the string is safe for the db query 
    $result = mysql_real_escape_string($result); 

    dbConnect(); 

    $SQL="SELECT fileID FROM upload WHERE fileName='".$result.".$ext'"; 

    $rs = mysql_query($SQL); 
    if (mysql_num_rows($rs) > 0) { 
     $result = str_replace(".$ext", time(), $result); 
     $result = "$result.$ext"; 
    } 
    return $result; 
} 
+0

我看到,我所接受的方式是有點老派,它使我成爲。因爲當我在學校學習時,我的老方法變得艱難,而不是新方法。 – sn1984

+0

好吧,這就是互聯網的美麗 - 你可以教你自己任何你想知道的東西。 – rdlowrey

+0

我明白如何做一個簡單的代碼來做上傳,但是讓我困惑的是添加代碼是將文件轉換爲全部小寫.Check以確保文件名尚未被插入到數據庫中,並且如果用戶上傳一個.png或.jpg文件,將圖像調整爲縮略圖,並在名爲uploads的文件夾中保留縮略圖和常規大小圖像的副本。我已經在這裏呆了幾天,我正在閱讀的內容與簡單的上傳文件相同。什麼是一些好的網站可能會更好地解釋。 – sn1984