2012-03-25 14 views
4

私は以下のスクリプトを使用していますので、ユーザーはプロフィール画像をアップロードできます。画像が初めてアップロードされたとき(画像がその場所に存在しないとき)、それは素晴らしい作品です。ただし、画像がパスに既に存在する場合(ユーザーがプロファイル画像を変更しようとすると)、新しい画像は古い画像を置き換えません。私はその質問に対して成功を収めています。move_uploaded_file()は既存の画像を置き換えません

ご協力いただければ幸いです。それは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'); 
+1

あなたがアップロードを介して、またはファイルを自分で作成することにより、最初の画像を作成しましたか?後者の場合は、権限の問題かもしれません。 – PlexQ

+0

実際、今私はそれについて考えて、あなたのPHPのバージョンを確認してください。私はこの数年前にバグを提出しました。それは何年も修正されていないことを知っています。まだそうではないかもしれませんし、修正されていないバージョンを使用している可能性もあります。 – PlexQ

+1

ファイルの移動に失敗した場合、なぜmysql_error()を使用していますか?その時点でmysqlクエリを作成していませんでした... – Shikiryu

答えて

20

は、より良い方法は、ファイルをアンリンクするだろう。その場合、SQLはまったく実行されないので、elseブランチにエコーされるmysql_errorは実際にはエラーを出力しません。

move_uploaded_fileが失敗すると、警告が表示され、PHPの設定に応じて表示されます。しかし、この問題はMySQLとは関係ありません。

ターゲットファイルが存在する場合は、最初に明示的に削除しようとするとします。ファイルを削除するには、file_exists、次にunlinkをチェックしてください。 unlinkが失敗した場合は、おそらくファイルの削除や上書きを許可しない場合よりもアクセス許可の問題です。

+0

素晴らしい作品です!ありがとう – BlackMouse

+2

必ずしも良いとは限りません。 move_uploaded_fileそれ自体を行う必要があります – GolezTrol

4

が存在する場合

おかげ

<?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(); 
    } 


?> 
2

いいえ、あなたのロジックは間違っています。あなたのプロフィール画像のURLをここで、FacebookやTwitterで見てみましょう。固定予測可能な名前を使用していますか?彼らはそうではなく、それには非常に正当な理由があります。ユニークで予測できないファイル名が必要です。

このお試しください:データベースとリンク解除(で、ユーザーのプロフィールの写真を更新し、それが成功した場合、新しい写真をアップロードし、その後、データベースから古い画像の名前を照会その後

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

を)以前に取得された情報を使用して古いファイルを取得する。

phpファイルやその他の不快なものをアップロードすることを許可していないことを確認してください。php fileinfo extensionを使用することができます。

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); 
関連する問題