2009-02-10 7 views
0

J'ai une méthode pour enregistrer une image, qui est censée gérer correctement une erreur, en définissant $ imageSrc à une image particulière en cas de défaillance. Ma méthode fonctionne bien si l'image est présente, mais aucune condition d'erreur ne semble être traitée correctement.Problème avec la fonction php pour intercepter l'erreur lors de la sauvegarde de l'image

$imageSrc = save_pic($PIC_URL, $pk); 

function save_pic($pic_url, $pk) { 
    $imageDir = './'; 
    if (!strlen($pic_url)) 
      return "removed.jpg"; 
    if (!is_dir($imageDir) || !is_writable($imageDir)) { 
     return "removed.jpg"; 
    } 
    $image = file_get_contents($pic_url); 
    if (empty($image)) { 
     return "removed.jpg"; 
    } 
    $r = file_put_contents($imageDir.$pk.".jpg", $image); 
    if ($r) { 
      return "./$pk.jpg"; 
    } else { 
      return "removed.jpg"; 
    } 
} 

Si l'image n'existe pas, je reçois:

Warning: getimagesize(http://127.0.0.1/555.jpg) [function.getimagesize]: failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found 
in C:\Program Files\EasyPHP 2.0b1\www\get_auction.php on line 144 

Array (
[type] => 2 [message] => getimagesize(http://127.0.0.1/555.jpg) 
function.getimagesize]: failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found 
[file] => C:\Program Files\EasyPHP 2.0b1\www\get_auction.php 
[line] => 144 
) 1 

returned.jpg est jamais retourné en tout état de cause.

modifier: Code ajouté imageResize:

function imageResize($imageURL, $maxWidth, $maxHeight) 

{ 

global $outputWidth, $outputHeight, $maxWidth, $maxHeight; 

$size = getimagesize($imageURL); 

if ($size) { 

    $imageWidth = $size[0]; 

    $imageHeight = $size[1]; 

    $wRatio = $imageWidth/$maxWidth; 

    $hRatio = $imageHeight/$maxHeight; 

    $maxRatio = max($wRatio, $hRatio); 



    if ($maxRatio > 1) { 

     $outputWidth = $imageWidth/$maxRatio; 

     $outputHeight = $imageHeight/$maxRatio; 

    } else { 

     $outputWidth = $imageWidth; 

     $outputHeight = $imageHeight; 

    } 

} else { 

    die(print_r(error_get_last())); 

} 

} 
+0

n'est pas fou de PHP ou quoi! :) ... "un gars .Net";) – balexandre

+0

Il manque du code ici ... d'où vient le message getimagesize? –

+0

Il n'est pas clair à quel moment vous appelez imageResize() à partir de votre autre code. S'il vous plaît réorganiser pour fournir tout, y compris le message d'erreur actuel, si vous ne pouvez toujours pas le réparer vous-même, merci. – mark

Répondre

0

Le problème n'était pas un problème de code, mais a été causé par une corruption de fichier. Cela a été déterminé lors des tests sur d'autres machines.

0

Etes-vous sûr que vous écrivez dans le dossier racine? Parce que je ne vois aucun problème avec votre code. file_get_contents et file_put_contents ne semblent pas échouer, donc votre image est écrite quelque part.

+0

mais il ne traite pas le fichier non existant afin d'obtenir –

+0

alors file_get_contents * devrait * retourner FALSE mais n'est pas, est-ce correct? –

+0

Exactement, Le problème n'est pas avec le dossier en écriture, mais avec l'image inexistante à l'adresse –

0
$image = file_get_contents("http://example.com/test.png"); 
list($ver, $retcode, $message) = explode(' ', $http_response_header[0], 3); 
if ($retcode != 200) { 
    return "removed.jpg"; 
} 

$retcode contiendra HTTP code de réponse.

S'il vous plaît postez ici $retcode ici et ce que votre strlen($image) retourne, il pourrait aider à résoudre votre problème.

+0

le code d'erreur est 404, il l'indique dans le message d'erreur –

+0

Oui, et il peut l'analyser dans le code. – Quassnoi

+0

Je l'ai mis dans mon code comme vous le suggérez, et seule l'erreur file_Get_contens est sortie, rien après cela. –

0

Essayez ceci:

<?php 
$imageSrc = save_pic($PIC_URL, $pk); 

function save_pic($pic_url, $pk) 
{ 
    $imageDir = './'; 

    if (!strlen($pic_url)) 
    { 
     return 'removed.jpg'; 
    } 

    if(!is_dir($imageDir) || !is_writable($imageDir)) 
    { 
     return 'removed.jpg'; 
    } 

    if(!file_exists($pic_url)) 
    { 
     return 'removed.jpg'; 
    } 

    if (file_put_contents($imageDir . $pk . '.jpg', file_get_contents($pic_url))) 
    { 
      return $imageDir . $pk . '.jpg'; 
    } 
    else 
    { 
      return 'removed.jpg'; 
    } 
} 
+0

Salut Bart, cela avait le même comportement exact. –

+0

Pouvez-vous poster le code de C: \ Program Files \ EasyPHP 2.0b1 \ www \ get_auction.php autour de la ligne 144? Parce que c'est ce qui cause cette erreur: C: \ Program Files \ EasyPHP 2.0b1 \ www \ get_auction.php sur la ligne 144 –

+0

ligne 144 est juste $ imageSrc = save_pic ($ PIC_URL, $ pk); –

0

Debug? Obtenez un IDE qui inclut un débogueur, comme Eclipse ou Netbeans, rtm pour les fonctions pour voir comment répondre, ou faire un mauvais vieux routage en ligne pour faire écho à la valeur du code lors de l'exécution.

0

Il me semble que vous ne publiez pas votre code complet? Le message d'avertissement indique getimagesize(), mais nulle part getimagsize() n'est utilisé dans votre exemple. Pour recevoir une meilleure aide j'inclurais la méthode entière ou un message d'erreur mis à jour de vos efforts actuels. Veuillez également inclure la version de PHP que vous utilisez.

file_get_contents() renvoie false en cas d'erreur et fait ainsi de suite 404 erreurs HTTP, comme le démontre:

[email protected]:~$ php -r 'var_dump(file_get_contents("http://stackoverflow.com/i_do_not_exist.jpg"));' 

Warning: file_get_contents(http://stackoverflow.com/i_do_not_exist.jpg): failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found 
in Command line code on line 1 

Call Stack: 
    0.0002  51884 1. {main}() Command line code:0 
    0.0002  51952 2. file_get_contents() Command line code:1 

bool(false) 
[email protected]:~$ php -v 
PHP 5.2.6-5 with Suhosin-Patch 0.9.6.2 (cli) (built: Oct 5 2008 13:07:13) 

Essayer votre code, il fonctionne parfaitement bien pour moi ici:

$ cat test.php 
<?php 
$PIC_URL="http://stackoverflow.com/i_dont_exist.jpg"; 
$pk = "test"; 
$imageSrc = save_pic($PIC_URL, $pk); 
var_dump($imageSrc); 

function save_pic($pic_url, $pk) { 
    $imageDir = './'; 
    if (!strlen($pic_url)) 
      return "removed.jpg"; 
    if (!is_dir($imageDir) || !is_writable($imageDir)) { 
     return "removed.jpg"; 
    } 
    $image = file_get_contents($pic_url); 
    if (empty($image)) { 
     return "removed.jpg"; 
    } 
    $r = file_put_contents($imageDir.$pk.".jpg", $image); 
    if ($r) { 
      return "./$pk.jpg"; 
    } else { 
      return "removed.jpg"; 
    } 
} 
$ php test.php 

Warning: file_get_contents(http://stackoverflow.com/i_dont_exist.jpg): failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found 
in /home/mfischer/tmp/532480/test.php on line 14 

Call Stack: 
    0.0005  59824 1. {main}() /home/mfischer/tmp/532480/test.php:0 
    0.0005  60176 2. save_pic() /home/mfischer/tmp/532480/test.php:4 
    0.0006  60444 3. file_get_contents() /home/mfischer/tmp/532480/test.php:14 

string(11) "removed.jpg" 

PHP les fonctions ont la mauvaise habitude de simplement répandre des messages d'avertissement directement dans votre code, si vous n'aimez pas cela, vous pouvez les faire taire avec le '@' comme suggéré précédemment ou vous pouvez utiliser une bibliothèque HTTP Client comme fournie par PEAR_HTTP ou Zend_HTTP_Clie nt pour avoir un meilleur contrôle de la gestion des erreurs. Rouler votre propre chose avec des sockets, fsockopen, etc. serait également possible.

Mais revenons-en au point: si ça ne fonctionne toujours pas, je pense qu'il manque des informations.

+0

J'ai mis à jour ma question pour montrer la fonction ImageResize. Le problème semble être avec l'erreur 404 cependant. –

0

Si vous ne recherchez pas les erreurs file_get_contents?Je veux dire avec quelque chose comme

if(false == ($image = file_get_contents($pic_url))){ 
     return "removed.jpg"; 
    } 
0
  • Envoyer HTTP HEAD à l'URL donnée
  • Check returnCode == 200 (le fichier est là) sinon il est retiré
  • Vérifiez que tête Content-Type est l'image/* (par exemple image/png) sinon il est retiré
  • Si le serveur envoyé en-tête Content-Length, lisez que pour variables
  • file_get_contents (URL)
  • Si le serveur a envoyé ce Conten t-Longueur voir si la taille correspond à autre il est retiré
  • Enregistrer l'image
  • Essayez getimagesize(), si elle donne des erreurs supprimer via unlink() et il est retiré d'autre garder
  • succès!
0

Vous rencontrez des problèmes de chemin. Vous devez stocker le chemin complet de l'image dans une définition.

Assurez-vous que ce fichier provient de la fonction save_pic.

DEFINE("RemovedPicUrl", "http://" . $_SERVER['SERVER_NAME'] . "/path/to/removed/image/removed.jpg") 

changer alors toutes les occurences de

"Removed.jpg" 

à

RemovedPicUrl 

Et je parie que vous un dollar qui fixe votre problème.

Questions connexes