2009-02-06 8 views
5

J'utilise cette ligne pour obtenir et enregistrer une image à partir d'une URL. Je ne sais pas quelle est la meilleure façon de gérer une erreur. En ce moment, il échoue parce qu'il n'y a pas d'autorisation, ce qui sera corrigé sous peu, mais je voudrais qu'il soit capable de gérer des situations où PIC_URL est vide ou pas une image. Dois-je mourir avec l'erreur à ce niveau (probablement c'est mieux pour les choses liées à la permission) ou devrais-je vérifier plus haut si PIC_URL est vide, ou les deux?clause d'erreur pour file_put_contents

Quelle est la meilleure approche?

+0

Le seul commentaire que je ferais ici est que si allow_fopen_url = Off est réglé sur votre php.ini serveurs (comme il peut être dans certains contextes d'hébergement partagé), votre code ci-dessus échouera. –

Répondre

5

Je ne suis pas assez talentueux pour demander c'est la meilleure méthode, mais je voudrais juste tester le long du chemin:

$imageDir = "/path/to/images/dir/"; 
$imagePath = "$imageDir$pk.jpg"; 
if (!is_dir($imageDir) or !is_writable($imageDir)) { 
    // Error if directory doesn't exist or isn't writable. 
} elseif (is_file($imagePath) and !is_writable($imagePath)) { 
    // Error if the file exists and isn't writable. 
} 

$image = file_get_contents(urlencode($PIC_URL)); 
if (empty($image)) { 
    // Error if the image is empty/not accessible. 
    exit; 
} 

file_put_contents($imagePath, $image); 
+0

vous pouvez également vouloir vérifier la valeur de retour de file_put_contents() –

+0

Corrigez-moi si je me trompe, mais file_get_contents ne lancera pas toujours un certain niveau d'erreur s'il ne pouvait pas ouvrir le fichier? Ce n'est peut-être pas fatal mais c'est toujours une erreur. –

+0

Je ne crois pas si Mike, ou au moins il n'est pas répertorié dans la documentation: http://www.php.net/manual/en/function.file-get-contents.php Malheureusement, je ne sais pas connaître un moyen de définir un délai d'expiration de sorte que le script est bloqué en attente d'une valeur de retour si l'URL demandée se bloque. – chuckg

0

deux, en ce qui me concerne. Surtout avec ces fonctions de gestion de fichiers dangereuses, la double vérification ne fait pas de mal. (D'où vient $pk?)

Généralement, vérifiez plus haut pour un retour plus agréable à l'utilisateur et vérifiez avant d'exécuter pour la sécurité. Il est difficile de donner des commentaires décents à l'utilisateur lors de la vérification à un niveau faible. D'un autre côté, il est difficile de vérifier toutes les erreurs possibles (comme les permissions du système de fichiers) à un niveau élevé et générique.

0

essayez de créer une fonction pour cela.

<?php 
define('OK', 0); 
deinfe('URL_EMPTY', 1); 
define('WRITING_PROBLEMS',2); 
define('OTHER_PROBLEM', 3); 


function save_pic($pic_url) { 

    $imageDir = '/path/to/images/dir/'; 

    if (!strlen($pic_url)) 
    return URL_EMPTY; 

    if (!is_dir($imageDir) || !is_writable($imageDir)) { 
    return WRITING_PROBLEMS; 
    } 

    $image = file_get_contents(urlencode($pic_url)); 

    $pk = time(); // or whatever you want as key 


    $r = file_put_contents($imagePath.$pk.".jpg", $pic_url); 

    if ($r) 
    return OK; 
    else 
    return OTHER_PROBLEM; 

} 
?> 
0

Hmm vous ne pourriez pas le faire aussi

file_put_contents($file, $str) or die("Unable to write file!");