【问题标题】:Unable to get JSON data from Img2Json API for large files in PHP无法从 Img2Json API 获取 PHP 中大文件的 JSON 数据
【发布时间】: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/olympus-c960.jpg

两个失败的:http://img2json.appspot.com/go/?callback=hello&url=http://cloudousmain.s3.amazonaws.com/54img.JPG

和

http://img2json.appspot.com/go/?callback=hello&url=http://cloudousmain.s3.amazonaws.com/IMG_20130329_120227.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 之前删除垃圾,如果可能的话,或者可能逐行解码。

标签: php mysql json amazon-s3


【解决方案1】:

看起来这是一个 AWS 错误,它是用 XML 编写的,无法解析 EXIF 数据。当我尝试在浏览器中查看坏图像时,我收到“拒绝访问”,但好的图像显示图像。

要在代码中检查这一点,请 ping 图像文件的标头并检查内容类型是否为 application/xml 或 http 代码是否为 403。我建议使用 http_head() 或标记 CURLOPT_HEADER在curl_setopt() 获取此信息。

【讨论】:

  • 我删除了许多图片并重新上传了新图片,这可能是访问被拒绝的原因。
【解决方案2】:

当 JSON 为 NULL 时,我最终默认使用 PHP 的 Exif 函数。不是我想做的,但它奏效了。

【讨论】:

  • 您应该向服务所有者发送一封电子邮件,通知他们损坏的 json。
猜你喜欢
  • 1970-01-01
  • 2019-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-11
  • 1970-01-01
  • 2021-05-21
  • 1970-01-01
相关资源
最近更新 更多