我有以下代码,文件是一个ajax调用:
try {
echo json_encode(exif_read_data($_POST["url"]));
} catch (Exception $e) {
echo "Invalid URL";
}
它的目的是接受一个图像url并返回json编码的EXIF数据,当有一个"正确"的url时,json_encode(exif_read_data($_POST["url"]));
工作正常。
然而,当我故意传递它一个"坏"的url在jQuery ajax调用"url" : "url1"
,或在php文件直接..exif_read_data("bob")
,我收到这个错误在我的控制台日志:
Warning: exif_read_data() [function.exif-read-data]: Unable to open file in ../public_html/_photos/ajax/exif.php on line 3
false
函数json_encode()不抛出异常,如果你想抛出警告作为异常,你可以覆盖默认行为与set_error_handler()
这里你会发现一个很好的例子如何做到这一点
exif_read_data($sUrl)函数不会抛出异常。
尝试这样做:
$sUrl = $_POST['url'];
if ((isset($sUrl )) AND (file_exists($sUrl)))
{
echo json_encode(exif_read_data($sUrl ));
}
else
{
echo "Invalid URL";
}
正如Marc在评论中提到的,本地PHP函数不会抛出异常。为了正确处理无效的url,您可以手动验证文件,然后将内容的data-uri传递给exif_read_data()
。
你可以这样做:
// acceptable file extensions
$ext_whitelist = array('jpg', 'jpeg', 'tiff');
// extension for this file name
$extension = strtolower( pathinfo($_POST['url'], PATHINFO_EXTENSION) );
// make sure we will be able to get the exif data
if (!in_array($extension, $ext_whitelist)) {
echo 'Invalid URL';
} else {
$contents = file_get_contents($_POST['url']);
// we couldn't open the file
if ($contents === false) {
echo 'Invalid URL';
} else {
// build the data uri
$uri = "data://image/$extension;base64,". base64_encode($contents);
echo json_encode( exif_read_data($uri) );
}
}