2012-03-25 9 views
4

아래 스크립트를 사용 중이므로 사용자가 프로필 사진을 업로드 할 수 있습니다. 처음으로 이미지를 업로드하면 (이미지가 해당 위치에 없을 때) 효과가 있습니다. 그러나 이미지가 경로에 이미있는 경우 (사용자가 프로필 사진을 변경하려고하는 경우) 새 이미지는 이전 이미지를 대체하지 않습니다. 나는 그 질문에 대한 성공을 얻는다.move_uploaded_file()이 기존 이미지를 대체하지 않습니다.

도움이 될 것입니다!

감사

<?php 

ini_set('display_errors',1); 

error_reporting(E_ALL); 


require_once('db.php'); 


$name = $_POST['name']; 

    $dir = '../uploadImages/'; 
    $file = basename($_FILES['image']['name']); 

    $uploadfile = $dir . $file; 


    if(move_uploaded_file($_FILES['image']['tmp_name'], $uploadfile)) 
    { 


     $path = $name; 
     $path .= 'Image.png';  
     $query = mysql_query("UPDATE users SET imagePath='$path' WHERE username='$name'"); 

     if ($query) 
     { 
      echo 'success'; 
     } 
     else 
     { 
      echo 'error'; 
     } 


    } 
    else 
    { 
     echo mysql_error(); 
    } 


?> 
+1

당신은 업로드를 통해 또는 파일을 직접 작성하여 첫 번째 이미지를 만들나요? 후자의 경우 권한 문제 일 수 있습니다. – PlexQ

+0

사실, 이제 PHP 버전을 확인해 보겠습니다. 나는 몇 년 전에 버그를 제기했고, 수년 동안 고쳐지지 않았다는 것을 알고 있습니다. 그래서 여전히 그렇지 않을 수도 있습니다. 그렇지 않으면 수정되지 않은 버전을 사용할 수도 있습니다. – PlexQ

+1

파일 이동에 실패하면 왜 mysql_error()를 사용하고 있습니까? 그 당시 mysql 쿼리를 만들지 않았다 ... – Shikiryu

답변

20

더 좋은 방법이되지 않은 연결 될이 move_uploaded_file가 실패하면 false를 반환

if(file_exists('your-filename.ext')) { 
    chmod('your-filename.ext',0755); //Change the file permissions if allowed 
    unlink('your-filename.ext'); //remove the file 
} 

move_uploaded_files($_FILES['image']['tmp_name'], 'your-filename.ext'); 
+0

위대한 작품! 감사합니다 – BlackMouse

+2

반드시 좋을 필요는 없습니다. move_uploaded_file 그 자체가해야합니다 – GolezTrol

4

존재하는 경우 파일을. 이 경우 아무런 SQL도 실행되지 않으므로 else 브랜치에 에코 된 mysql_error 브랜치는 실제로 오류를 출력하지 않습니다.

move_uploaded_file이 실패하면 PHP 설정에 따라 표시되는 경고가 표시됩니다. 그러나이 문제는 MySQL과 관련이 없습니다.

대상 파일이 있으면 먼저 명시 적으로 삭제하려고 시도합니다. 파일을 삭제하려면 file_exists으로 확인한 다음 unlink으로 확인하십시오. unlink이 실패하면 파일을 삭제하거나 덮어 쓸 수없는 것보다 사용 권한 문제 일 가능성이 큽니다.

2

아니요, 논리가 잘못되었습니다. 프로필 이미지 URL (facebook 또는 twitter ... 여기에서 고정 된 예측 가능한 이름을 사용하고 있음)을 확인하십시오. 그들은 그렇게하지 않으며, 그럴만한 이유가 있습니다. 고유하고 예측할 수없는 파일 이름이 필요합니다.

이 시도 :

$file = hash('sha256', openssl_random_pseudo_bytes(8)) . 'yourallowedextension'; 

그런 다음, 데이터베이스에서 오래 된 그림의 이름을 쿼리가 성공하면 그 이후, 새로운 그림을 업로드 데이터베이스에서 사용자의 프로필 사진을 업데이트하고 해제() 이전에 얻은 정보를 사용하여 이전 파일을 만듭니다.

php 파일이나 기타 불쾌한 것을 업로드 할 수 없도록하십시오. php fileinfo 확장자를 사용할 수 있도록하십시오.

1
$file=$_FILES['image']['name']; 
$path="your/location/".$file; 
if(file_exists($path) 
{ 
    chmod($path,0755); 
    unlink($path); 
} 

그런 다음 파일을 이동하십시오. 이렇게하면

+0

'file_exists' 함수 다음에 괄호가 없습니다 :')'. – TricksfortheWeb

0

, 새 이미지를 교체해야합니다 :

$sourcePath = $_FILES['image']['tmp_name']; 
list($width,$height)=getimagesize($sourcePath); 
$uploadedImage = imagecreatefromjpg($sourcePath); 
$newImage=imagecreatetruecolor($newWidth,$newHeight); 
imagecopyresampled($newImage,$uploadedImage,0,0,0,0,$newWidth,$newHeight,$width,$height); 
imagejpeg($newImage, $destinationPath,100); 
관련 문제