39

我建立了一个允许上传图片的网站,一旦上传了图片,就会显示一些关于照片的特定信息。从计算机上传图片效果很好,当我尝试从智能手机上传图片时出现问题。上传成功,但现在从计算机上传时显示的数据的主要部分似乎丢失了。

此代码部分是实际检索和显示数据的部分:

$location = $_FILES["pic"]["tmp_name"];
$data = exif_read_data($location);
var_dump($data);

var_dump($data)实际上会在计算机和智能手机中转储不同的数据。

显然它适用于 Android 智能手机,只有当我尝试从 iPhone 上传图像时才会出现问题。

例如,var_dump计算机上传:

array(49) { 
    ["FileName"]=> string(10) "php2D4.tmp" 
    ["FileDateTime"]=> int(1367318152) 
    ["FileSize"]=> int(30357) 
    ["FileType"]=> int(2) 
    ["MimeType"]=> string(10) "image/jpeg" 
    ["SectionsFound"]=> string(24) "ANY_TAG, IFD0, EXIF, GPS" 
    ["COMPUTED"]=> array(6) { 
        ["html"]=> string(24) "width="320" height="240""  
        ["Height"]=> int(240)  
        ["Width"]=> int(320)  
        ["IsColor"]=> int(1)  
        ["ByteOrderMotorola"]=> int(1)  
        ["ApertureFNumber"]=> string(5) "f/2.8"  
    }  
    ["Make"]=> string(5) "Apple"  
    ["Model"]=> string(8) "iPhone 4"  
    ["Orientation"]=> int(3)  
    ["XResolution"]=> string(4) "72/1"  
    ["YResolution"]=> string(4) "72/1"  
    ["ResolutionUnit"]=> int(2)  
    ["Software"]=> string(5) "6.1.3"  
    ["DateTime"]=> string(19) "2013:04:26 23:57:43"  
    ["YCbCrPositioning"]=> int(1)  
    ["Exif_IFD_Pointer"]=> int(204)  
    ["GPS_IFD_Pointer"]=> int(594)  
    ["ExposureTime"]=> string(4) "1/15"  
    ["FNumber"]=> string(4) "14/5"  
    ["ExposureProgram"]=> int(2)  
    ["ISOSpeedRatings"]=> int(1000)  
    ["ExifVersion"]=> string(4) "0221"  
    ["DateTimeOriginal"]=> string(19) "2013:04:26 23:57:43"  
    ["DateTimeDigitized"]=> string(19) "2013:04:26 23:57:43"  
    ["ComponentsConfiguration"]=> string(4) ""  
    ["ShutterSpeedValue"]=> string(9) "4889/1250"  
    ["ApertureValue"]=> string(9) "4281/1441"  
    ["BrightnessValue"]=> string(10) "-3581/1451"  
    ["MeteringMode"]=> int(5)  
    ["Flash"]=> int(24)  
    ["FocalLength"]=> string(5) "77/20"  
    ["SubjectLocation"]=> array(4) {  
        [0]=> int(1295) 
        [1]=> int(967) 
        [2]=> int(699) 
        [3]=> int(696) 
    } 
    ["FlashPixVersion"]=> string(4) "0100" 
    ["ColorSpace"]=> int(1) 
    ["ExifImageWidth"]=> int(2592) 
    ["ExifImageLength"]=> int(1936) 
    ["SensingMethod"]=> int(2) 
    ["ExposureMode"]=> int(0) 
    ["WhiteBalance"]=> int(0) 
    ["FocalLengthIn35mmFilm"]=> int(35) 
    ["SceneCaptureType"]=> int(0) 
    ["GPSLatitudeRef"]=> string(1) "N" 
    ["GPSLatitude"]=> array(3) { 
        [0]=> string(4) "31/1" 
        [1]=> string(8) "5854/100" 
        [2]=> string(3) "0/1" 
    } 
    ["GPSLongitudeRef"]=> string(1) "E" 
    ["GPSLongitude"]=> array(3) { 
        [0]=> string(4) "34/1" 
        [1]=> string(8) "4684/100" 
        [2]=> string(3) "0/1" 
    } 
    ["GPSTimeStamp"]=> array(3) { 
        [0]=> string(4) "20/1" 
        [1]=> string(4) "57/1" 
        [2]=> string(8) "4272/100" 
    } 
    ["GPSImgDirectionRef"]=> string(1) "T" 
    ["GPSImgDirection"]=> string(9) "48089/465" 
}

var_dump智能手机上传:

array(12) { 
    ["FileName"]=> string(9) "phpSzwfPw" 
    ["FileDateTime"]=> int(1367318054) 
    ["FileSize"]=> int(1778041) 
    ["FileType"]=> int(2) 
    ["MimeType"]=> string(10) "image/jpeg" 
    ["SectionsFound"]=> string(19) "ANY_TAG, IFD0, EXIF" 
    ["COMPUTED"]=> array(5) { 
        ["html"]=> string(26) "width="2592" height="1936"" 
        ["Height"]=> int(1936) 
        ["Width"]=> int(2592) 
        ["IsColor"]=> int(1) 
        ["ByteOrderMotorola"]=> int(1) 
    } 
    ["Orientation"]=> int(3) 
    ["Exif_IFD_Pointer"]=> int(38) 
    ["ColorSpace"]=> int(1) 
    ["ExifImageWidth"]=> int(2592) 
    ["ExifImageLength"]=> int(1936) 
}

这是电脑 var_dump($_FILES)

    array(1) 
{ ["pic"]=> array(5) 
{ ["name"]=> string(18) leaf2.JPG" 
["type"]=> string(10) "image/jpeg" 
["tmp_name"]=> string(14) "/tmp/phpzeDUs9"
 ["error"]=> int(0)
 ["size"]=> int(46439) } }

这是iPhone的结果var_dump($_FILES)

    array(1) { ["pic"]=> array(5) 
{ ["name"]=> string(9) "image.jpg" 
["type"]=> string(10) "image/jpeg" 
["tmp_name"]=> string(14) "/tmp/phplPUZky" 
["error"]=> int(0) ["size"]=> int(1455577) } } 

编辑:这是上传表单的 HTML 代码:

     <form action="results.php" id="upload-image" method="post" enctype="multipart/form-data">
         <div class="fileupload fileupload-new" data-provides="fileupload">
          <div class="fileupload-preview thumbnail" style="width: 200px; height: 150px;"></div>
          <div>
            <span class="btn btn-file"><span class="fileupload-new">Select image</span><span class="fileupload-exists">Change</span><input type="file" name="pic" id="pic" accept="image/*"/></span>
            <a href="#" class="btn fileupload-exists" data-dismiss="fileupload">Remove</a>
            <button type="submit" class="btn">Upload</button>
            </br>
            <span class="upload-error"></span>
          </div>
     </form>

什么可能导致它?

4

11 回答 11

28

问题

iphone(ipad等,从现在开始我就叫它iphone)剥离exif数据是正确的。这也不是 iphone 上的错误,而是一个功能。

android 用户不喜欢 iphone 和 iphone 用户不喜欢 android 的主要原因之一是因为 iphone 非常有限(在更改、更改等方面的自由方面)。您不能只运行下载的应用程序,对设置的访问受限等。

这是因为苹果的策略是创造一个故障安全的产品。“如果你不能做奇怪的事情,那么奇怪的事情就不会发生”。它试图以各种可以想象的方式保护用户。它还可以在上传图像时保护用户。在 exif 中可能存在可能损害用户隐私的数据。诸如 GPS 坐标之类的东西,但即使是时间戳也会伤害用户(想象一下,您上传​​一张带有时间戳的海滩图片,从您报告与老板生病的那一刻起)。

所以基本上,剥离所有 exif 数据是一种安全措施。我自己和很多其他人都不同意这种策略,但不幸的是,我们对此无能为力。

解决方案

更新:这不起作用。(感谢 likeitlikeit 提供此信息)

幸运的是,您可以解决这个问题。Javascript来救援。使用 javascript,您可以读取 exif 数据并通过添加一些额外的 POST 数据将其与您的照片一起发送。

请注意:此解决方案是由另一位开发人员提供给我的,尚未经过测试。

来源

您正在寻求可靠的来源。不幸的是,他们很难找到,因为苹果没有像往常一样说话,因此我所掌握的所有信息都是道听途说。

也许我可以提供的更可靠的消息来源之一是 flickr 工作人员之一,他确认根本原因是移动 safari 剥离 exif。 http://www.flickr.com/help/forum/en-us/72157632100391901/#reply72157632135956813

于 2013-05-03T14:26:26.733 回答
7

Apple 没有关于此功能的官方声明,尽管即使在 Apple 论坛上也有很多人询问此功能。实际上,从网上的报道来看,这不仅发生在 iPhone 上传到 Safari 中,还发生在电子邮件附件中。

但是,很明显,有很多人受此影响。Flickr 似乎是一个主要受害者,但也有其他受害者。

幸运的是,现在有一些方法可以访问<input type="file">标签的原始文件数据。这使您可以获取所需的 EXIF 信息,将其放入隐藏的表单字段中,并将其与实际文件上传一起发送。我从这个答案改编了一个jsfiddle来展示我的意思:

看看

更新:JavaScript 没有帮助

这似乎对当前一代的 iOS 设备没有预期的效果,因为APIFileReader只能访问文件的净化版本。

于 2013-05-05T20:02:15.240 回答
6

如果图片是从 iphone 通过电子邮件发送并保存到 mac,则 exif 数据将被保留。如果通过 IMage Capture 将其复制到 mac,则会保留 exif 数据。仅当从相机角色上传到服务时,exif 数据才不会随上传一起发送。

于 2013-09-14T05:07:36.140 回答
3

我遇到了同样的问题。以下是解决方法

要解决此问题...进入设置、相机、格式。选择“最兼容”。

https://www.flickr.com/help/forum/en-us/72157700799502582/

于 2019-10-24T03:36:42.887 回答
1

我目前使用的是 iOS 8.1.1,而且我还注意到在通过移动 safari 上传时从照片中删除某些 Exif 数据的这种不可爱的行为。我注意到全新安装的相同行为:

  • 迷你歌剧
  • 铬合金

所以我的假设是行为与浏览器无关,而是将照片传输到另一个应用程序(未经 Apple 授权)时的相机应用程序。

有没有人找到 Apple 的有关此 Exif 数据切割的官方声明?

于 2014-11-24T21:39:55.847 回答
0

不幸的是,如果您从 iphone 上传到服务器(如我的情况),itamar (op),IFDO: MAKE 将被剥离。如果图片保存在 iPhone 上并通过电子邮件发送,则数据就在那里。

我需要 MAKE 信息才能正确旋转照片。Apple 和 Android 的 ORIENTATION 值不同,如果我有 MAKE,我可以编写代码来适应。无法理解知道拍摄照片的设备可能带来的保密问题。

缺少 Apple 允许用户选择要上传的 PIC 数据信息,可能在设置中,可能的解决方案:

  • 创建代码以将保存的文件(不共享图片)上传到服务器位置,然后附加/添加到最终位置
  • 使用商业应用上传,例如http://www.transloadit.com
  • 而不是依赖于 MAKE 的 EXIF 数据,我只是决定找出用于发送数据的设备和 o/s。将探索“client_agent”作为起点。

刚刚从上传到 TRANSLOADIT 的 RESULT JSON 中得到了这个想法。它显然有我们需要的数据:

"client_agent": "Mozilla/5.0 (iPad; CPU OS 7_1_1 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) CriOS/34.0.1847.18 Mobile/11D201 Safari/9537.53",

如果他们可以“看到”操作系统和设备,我们也可以。

如果我们得到该数据,那么它可以添加到 pic EXIF 并在其他地方使用。

希望这有帮助。

编辑:来自 Windows PC 的数据用于说明使用 "echo $_SERVER['HTTP_USER_AGENT'] . "\n\n";" 时

从 PC:Mozilla/5.0(Windows NT 6.2;WOW64)AppleWebKit/537.36(KHTML,如 Gecko)Chrome/35.0.1916.114 Safari/537.36 文件

来自 IPAD:“Mozilla/5.0(iPad;CPU OS 7_1_1,如 Mac OS X)AppleWebKit/537.51.1(KHTML,如 Gecko)CriOS/34.0.1847.18 Mobile/11D201 Safari/9537.53”,

编辑:添加对 php.net 的引用并获取浏览器: http ://www.php.net/manual/en/function.get-browser.php

于 2014-05-27T20:55:19.920 回答
0

我刚刚尝试了另一个浏览器 Opera Mini,它成功了!得到了我所有的 exif 数据!

于 2014-09-05T21:30:05.143 回答
0

我也有一个类似的问题,从 iPhone 复制到 Windows 7 机器(也在各种机器上尝试过)。如果我将手机中的 jpg 文件复制到 PC 上,大量图片的 EXIF 信息会被严重删除。当时间戳和 GPS 信息误入歧途时,这非常烦人。更奇怪的是,如果我在 MS 的图片库中查看 jpg 并查看仍然存在的图像的拍摄日期戳,我可以恢复“拍摄日期” - 将日期向上更改一个然后输入然后再向下输入一个和日期带上的戳记将重新出现在 Windows 资源管理器中的文件中。这是奇怪行为之上更奇怪的行为,并且非常烦人。

欲了解更多信息:我没有安装 iTunes,因为这会导致其他不相关的问题。

回顾一下 - iPhone 连接到 PC,通过 Windows 资源管理器复制 jpg 文件,其中一些文件显然会丢失其 EXIF 信息。

于 2015-05-17T16:41:47.157 回答
0

一直在 iphone 6 上测试手机图片上传。为了迎合 iPhone 的方向。您必须为两种类型的图像上传做好准备。前置摄像头和后置摄像头。要从前置*自拍相机获取方向,您必须执行以下操作。首先将图像存储到服务器上的目标文件夹。

$image = imagecreatefromjpeg($source_url);
imagejpeg($image, $destination_url, $quality);

从那里开始,您从创建的目标文件中读取 EXIF

$exif = exif_read_data($destination_url, 0, true);
    if(!empty($exif['IFD0']['Orientation'])) {
        //rotate accordingly
}

这将为您提供方向编号以相应地旋转它。至于后置摄像头,您可以直接从源 URL 读取。从上传表单发布的文件。无需存储第一个然后读取 EXIF

$exif = exif_read_data($source_url);
    if(!empty($exif['Orientation'])) {
        //rotate accordingly
}
于 2016-10-05T08:29:55.083 回答
0

iPhone 将剥离大部分 exif 数据。您可以在这里进行测试:http: //metapicz.com/ 只需使用 safari 实现的上传功能...

有人找到了解决这个问题的好方法吗?

于 2019-10-10T19:23:06.433 回答
-3

我认为现在这个问题已经通过 iOS 的更新版本(我不知道是哪一个)得到解决。我不能 100% 确定这一点。

我最近刚刚注意到,这已经开始在我测试过的几款安装了 iOS 9.2 的不同 iPhone 上运行。

因此,如果你们所有人都可以拿出 iPhone 并开始测试,那么看看这个问题是否已经解决了。

于 2016-01-15T06:46:47.573 回答