2009-02-06 17 views
5

Estoy utilizando esta línea para obtener y guardar una imagen de una URL.cláusula de error para file_put_contents

file_put_contents("./images/".$pk.".jpg", file_get_contents($PIC_URL)) 

No estoy seguro de cuál es la mejor manera de manejar un error. En este momento está fallando porque no hay permiso, que se remediará en breve, pero me gustaría que sea capaz de manejar situaciones en las que PIC_URL está vacío o no es una imagen. ¿Debería haber muerto con el error en este nivel (probablemente es mejor para las cosas relacionadas con permisos) o debería consultar más arriba si PIC_URL está vacío, o ambos?

¿Cuál es el mejor enfoque?

+0

El único comentario que me gustaría hacer aquí es que si allow_fopen_url = apagado está en su php.ini servidores (como puede ser en algunos contextos de alojamiento compartido), su código anterior fallará. –

Respuesta

5

No soy lo suficientemente talentoso como para reclamar este es el mejor método, pero me acaba de probar en el camino:

$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

es posible que también desee comprobar el valor de retorno de file_put_contents() –

+0

Corrígeme si me equivoco, pero ¿file_get_contents aún no arrojará algún nivel de error si no puede abrir el archivo? Puede que no sea fatal, pero sigue siendo un error. –

+0

No lo creo, Mike, o al menos no aparece en la documentación: http://www.php.net/manual/en/function.file-get-contents.php Lamentablemente, no lo hago saber de una manera de establecer un tiempo de espera para que el script quede atascado esperando un valor de retorno si se cuelga la URL solicitada. – chuckg

0

Ambos, por lo que yo soy preocupación. Especialmente con esas funciones peligrosas de manejo de archivos, la doble verificación no duele. (¿De dónde viene $pk?)

En general, consulte más arriba para obtener una mejor respuesta al usuario y verifique antes de ejecutar por seguridad. Es difícil dar comentarios decentes al usuario cuando solo se comprueba a un nivel bajo. Por otro lado, es difícil verificar todos los errores posibles (como los permisos del sistema de archivos) en un nivel alto y genérico.

0

intente hacer una función para esto.

<?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 ¿no podría también acaba de hacer

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

Cuestiones relacionadas