2011-12-04 3 views
0

파일을 업로드 할 수있는 코드를 작성 중입니다. 이 코드는 파일을 모두 소문자로 변환하는 것입니다. 파일 이름이 데이터베이스에 아직 삽입되지 않았는지 확인하고 사용자가 .png 또는 .jpg 파일을 업로드하는 경우 이미지를 축소판으로 크기를 조정하고 축소판 및 일반 크기의 이미지를 이름이 지정된 폴더에 업로드합니다. 나는 아직도 약간 혼란 스럽다. 왜냐하면 나는 그 위에 계속해서 나아 갔다. 어쩌면 내가 며칠 동안 작업 중이거나 그렇지 않은지 알 수 없다. 아무 것도 볼 수 없다. 뿐만 아니라 나는 아직도이 일을하는 초보자입니다. 나는 그것을 어딘가에 루핑 나는 단지 캔트 캐치 그것입니다 생각하고데이터베이스의 파일 업로드에 관하여

$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() 기능은 대단히 비효율적입니다. 루프 내부의 문자열의 각 문자에 대해 정규식을 사용하는 것은 핸들에 묶인 다이너마이트가있는 슬레지 해머로 달걀을 깨는 것과 같습니다. 또한 데이터베이스에 저장하기 전에 데이터를 살균하는 것이 목표라면 db에 대한 쿼리를 수행하기 전에 데이터에 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

업로드를 수행하는 간단한 코드를 만드는 방법을 이해하지만 저를 혼란스럽게 만드는 것은 파일을 모두 소문자로 변환하는 것입니다. 파일 이름이 데이터베이스에 이미 삽입되어 있지 않은지 확인하고 사용자가 업로드 한 파일인지 확인하십시오 .png 또는 .jpg 파일의 이미지를 축소판 이미지로 크기를 조정하고 축소판 이미지와 일반 크기 이미지의 복사본을 uploads라는 폴더에 보관합니다. 나는이 일을 며칠 동안 해왔으며 내가 읽는 모든 것은 단순한 업로드 파일과 같은 것이다. 더 나은 설명에 도움이되는 좋은 웹 사이트는 무엇입니까? – sn1984

관련 문제