【发布时间】:2013-11-29 13:57:16
【问题描述】:
我正在使用http://img2json.appspot.com/ 来检索和存储用户上传图像的 Exif 数据。我注意到对于较小的文件,效果很好。对于较大的文件,或者对于具有大量 Exif 数据的文件,会存储文件,但不会存储 Exif 数据。我不知道这是否是因为服务需要很长时间才能生成 JSON,或者是否存在内存问题,因为我将所有 JSON 存储在 PHP 数组中。
我用于检索用户上传图片的 Exif 数据的代码如下:
$exifd = file_get_contents("http://img2json.appspot.com/go/url=http://myURL.com/$fileName");
$response = json_decode($exifd, true);
$shut = $response['exif']['ShutterSpeedValue'];
$iso = $response['exif']['ISOSpeedRatings'];
$dateTime = $response['exif']['DateTime'];
$aperture = $response['exif']['ApertureValue'];
$focalLength = $response['exif']['FocalLength'];
$make = $response['exif']['Make'];
$model = $response['exif']['Model'];
$software = $response['exif']['Software'];
$flash = $response['exif']['Flash'];
$sql="INSERT INTO EXIF (uniqueID, dateTime, aperture, focalLength, make, model, software, shutterSpeed, ISO, flash)
VALUES('$id', '$dateTime', '$aperture', '$focalLength', '$make', '$model', '$software', '$shut', '$iso', '$flash')";
if (!mysql_query($sql,$link))
{
die('Error: ' . mysql_error());
}
}else{
echo "Something went wrong while uploading your file... sorry.";
}
正如我之前提到的,这在大多数情况下都很好用,但它不适用于大文件(大文件或 Exif 数据量大),而且有时小文件也会失败。
两个失败的:http://img2json.appspot.com/go/?callback=hello&url=http://cloudousmain.s3.amazonaws.com/54img.JPG
和
我增加了 ini 文件中的内存,但没有成功。此外,可能值得注意的是,在处理图像时会显示一个进度条,直到事情完成(或应该完成)。有什么想法吗?
编辑:切换到 curl 并使用 var_dump 显示“不工作”的图像被转储为 NULL,而工作正常的图像按预期给我一个 Exif 数据数组。
【问题讨论】:
-
我很快通过了这个尝试重现这个问题,我对出了什么问题有两个猜测。首先,没有抛出异常,没有警告和通知,所以我认为一个公平的假设是格式错误的 json。我对此事的第二个猜测是 php 如何处理返回的响应存在问题。我不知道它是否试图编码一些奇怪的分组“x00”
-
我怀疑 JSON 也是问题所在,尽管我不确定为什么。此外,我需要的任何特定值都不会得到奇怪的“x00”外观,所以我想知道这是否重要。由于 JSON 是在 PHP 中解码的,我得到了一个数组,我不能跳过“混乱”的值吗?
-
在 json_decode 函数期间发生故障。所以有些东西导致这个失败。您在存储 file_get_contents 的结果时正在处理字符串值。这很可能是需要任一字符编码的地方。您没有访问可能是罪魁祸首的值并不重要。如果我是你,我会尝试在 file_get_contents 上使用 curl 并将其转储到文件中。这可能有助于您的调试问题。
-
我按照你的建议做了,得出的结论是 JSON 无效。 “工作”的图像给了我一个我期望的转储。那些不给我一个大胖子NULL的人。当我通过 JSONLint.com 将非工作 JSON 放入
"Tag0xa420": "OAEL01\x00\x00\x00\/时出现解析错误,因为它的Expecting 'STRING', 'NUMBER', 'NULL', 'TRUE', 'FALSE', '{', '['。我想我会尝试在解码 JSON 之前删除垃圾,如果可能的话,或者可能逐行解码。