2009-03-01 8 views
2

Comment puis-je empêcher file_get_contents de créer un fichier vide lorsqu'il est utilisé comme condition de test dans une clause if?file_get_contents créer un fichier vide

Un fichier vide est créé malgré tout, ce qui provoque un appel ultérieur dans une méthode différente pour getimagesize() échouer. Le problème est que, comme j'ai ma configuration de code, la première fois qu'elle est appelée déterminera de sauvegarder une image ou d'afficher une image enregistrée précédemment. Cela dépend en partie de la présence d'un fichier. Lorsqu'un fichier vide est créé, cela provoque des problèmes lors de l'appel ultérieur de mon code.

Le moyen le plus simple d'ajouter une vérification si le fichier existe et est supérieur à 0? Indépendamment du fait que mon code fonctionne, file_get_contents produira toujours une erreur. Cette erreur est expliquée et traitée (par ma condition if), donc je voudrais éviter l'erreur d'interrompre la sortie de mon application si possible. Existe-t-il un moyen de désactiver cela sans cacher les erreurs réelles?

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

Répondre

1

Il n'est pas file_get_contents() qui crée un fichier vide, il est file_put_contents(). File_put_contents() va créer un fichier même si le second paramètre est vide. Par conséquent, le fichier vide.

Vous devez d'abord vérifier que le fichier existe.

La solution la plus simple serait de déplacer file_put_contents() à l'intérieur du conditionnel, afin qu'il ne crée un fichier que s'il y a du contenu.

if (($filecontents = file_get_contents($pic_url)) !== false) 
{ 
    file_put_contents($imageDir . $pk . '.jpg', $filecontents); 
    return $imageDir . $pk . '.jpg'; 
} 
else 
{ 
    return 'removed.jpg'; 
} 

Maintenant, cela vous laisse toujours avec un tas de problèmes.

  • À moins que vous ne validiez correctement le $ pic_url, vous vous exposez à des failles de sécurité. Que faire si l'utilisateur entre un chemin relatif vers un fichier local? File_get_contents() lancera un avertissement si le fichier est introuvable.
  • Normalement, vous devrez gérer ceci en vérifiant d'abord file_exists(), mais ceci n'est PAS possible ici, car le wrapper http: ne supporte pas file_exists(). Vous pouvez donc supprimer l'erreur avec @ avant file_get_contents(). Supprimer les erreurs de ce genre devrait être évité dans la plupart des cas.
  • Même si vous supprimez l'erreur avec '@', l'appel à file_get_contents() peut encore prendre un certain temps - si l'adresse est incorrecte, cela peut entraîner l'absence de réponse d'un serveur, ce qui l'amènera à timeout (probablement 30 secondes) pendant laquelle votre script ne s'exécute pas et par conséquent un utilisateur final ne peut obtenir aucun retour. Cela devrait être pris en compte dans votre application.
3

Vérifiez si le fichier existe en utilisant file_exists:

if (file_exists($pic_url)) { 
    $contents = file_get_contents($pic_url); 
    if (!empty($contents)) { 
     file_put_contents($imageDir . $pk . '.jpg', $contents); 
     return $imageDir . $pk . '.jpg'; 
    } 
} 
return 'removed.jpg'; 
+0

Apparemment, file_exists() n'est pas pris en charge par l'encapsuleur d'URL HTTP/HTTPS (repose sur le support statistique), c'est-à-dire qu'il ne fonctionnera pas ici. – thomasrutter