2009-02-06 62 views
5

我正在使用此行从URL获取并保存图像。file_put_contents的错误子句

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

我不确定什么是处理错误的最佳方法。目前它失败了,因为没有许可,很快就会得到补救,但我希望它能够处理PIC_URL为空或不是图像的情况。我应该死在这个级别的错误(可能是更好的权限相关的事情),或者我应该检查更高,如果PIC_URL是空的,或两者?

哪种方法最好?

+0

我会成为这里唯一的评论是,如果allow_fopen_url =关设置你的服务器的php.ini(因为它可能是在一些共享主机上下文中),上面的代码将失败。 – 2009-02-06 11:34:20

回答

5

我不是声称这是最好的方法足够的天赋,但我只想沿途测试:

$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

你可能也想检查从file_put_contents() – 2009-02-06 11:46:21

0

两个,据我的关注。特别是对于那些危险的文件处理功能,双重检查不会造成伤害。 ($pk来自哪里?)

通常,请检查较高级别以获得更好的用户反馈,并在执行安全性检查之前进行检查。仅在低水平检查时,很难给用户提供良好的反馈。另一方面,很难在高级和通用级别检查所有可能的错误(如那些文件系统权限)。

0

试着为此做一个功能。

<?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

嗯不能也只是做

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