从iPhone上传图像会删除exif数据


Image upload from iPhone strips exif data

我建立了一个允许图片上传的网站,一旦图片上传,就会显示有关照片的一些具体信息。从电脑上传图片没问题,但当我试图从智能手机上传图片时,问题就出现了。上传成功了,但是似乎从计算机上传时显示的大部分数据现在丢失了。

以下代码段实际检索并显示数据:

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

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

显然它在Android智能手机上工作得很好,只有当我试图从iPhone上传图像时才会出现这个问题。

例如,var_dump from computer upload:

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 from smartphone upload:

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>

是什么原因引起的?

问题

iphone(ipad等,从现在起我就叫它iphone)删除exif数据是正确的。这也不是iphone的bug,而是一个功能。

android用户不喜欢iphone, iphone用户不喜欢android的一个主要原因是iphone非常有限(在改变、修改等方面的自由)。你不能只运行下载的应用程序,限制访问设置等。

这是因为苹果的策略是创造一种故障安全的产品。"如果你不能做奇怪的事情,奇怪的事情就不会发生"。它试图以各种可能的方式保护用户。它还可以保护用户上传图像。在出口可能有数据可以伤害用户的隐私。像GPS坐标这样的东西,但即使是时间戳也会伤害用户(想象一下,你上传了一张海滩照片,上面的时间戳是你向老板请病假的那一刻)。

所以基本上剥离所有退出数据是一种安全措施。我和很多人都不同意这个策略,但不幸的是,我们无能为力。

解决方案

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

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

请注意:这个解决方案是由另一个开发人员向我提出的,尚未经过测试。

你在要求可靠的消息来源。不幸的是,他们很难找到,因为苹果不像以往那样说话,因此我所拥有的所有信息都是道听途说。

也许我能提供的一个更可靠的消息来源是flickr的一名工作人员,他证实了根本原因是移动safari剥离了出口。http://www.flickr.com/help/forum/en-us/72157632100391901/#reply72157632135956813

苹果没有关于这个功能的官方声明,尽管有很多人甚至在苹果论坛上询问这个问题。实际上,从网络上的报道来看,这不仅发生在iPhone的Safari上,也发生在电子邮件附件上。

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

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

看一看。

更新:JavaScript没有帮助

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

如果PIC是从iPhone通过电子邮件发送并保存到mac,则exif数据将保留。如果它通过图像捕获复制到mac, exif数据被保留。只有当从相机角色上传到服务时,才存在未随上传一起发送的数据。

我也有同样的问题。下面是关于

的工作

要解决这个问题…进入设置,相机,格式。选择"大多数"兼容。

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

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

时也有相同的行为
  • Opera mini
  • Chrome
  • 水星

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

有没有人找到苹果关于Exif数据切割的官方声明?

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

我需要MAKE信息,以便正确旋转照片。苹果和安卓的取向值是不同的,如果我有MAKE,我可以通过代码来适应。我不明白知道是什么设备拍的照片有什么保密问题。

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

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

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

"client_agent": "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",

如果他们能"看到"o/s和设备,我们也能。

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

希望有帮助。

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

FROM PC: Mozilla/5.0 (Windows NT 6.2;WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.114 Safari/537.36 File

FROM 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和get浏览器:http://www.php.net/manual/en/function.get-browser.php

我刚刚尝试了另一个浏览器,Opera Mini,它工作了!拿到我所有的退出数据了!

我也有一个类似的问题,从iPhone(似乎不影响iOS/iPhone组合,因为它已经发生了多年)复制到Windows 7机器(也在各种机器上尝试过)。如果我把一个jpg文件从手机复制到PC上,大部分图片的EXIF信息都被严重删除了。当时间戳和GPS信息出错时,这是非常烦人的。更奇怪的是,如果我在MS的图片库中查看jpg,并查看仍然存在的图像日期戳,我可以恢复"拍摄日期"-将日期向上更改一个,然后输入一个,然后将日期戳重新出现在Windows资源管理器中的文件中。这是奇怪行为之上的更奇怪的行为,而且非常烦人。在PG修复之前,您不得对图像进行任何旋转或任何其他编辑,否则您将无法收回拍摄日期戳。

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

所以重述一下- iPhone连接到PC,通过Windows资源管理器复制jpg文件和一些文件显然会失去他们的EXIF信息。

一直在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
}

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

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

我认为这已经解决了现在的新版本的iOS(我不确切是哪个)。这件事我不能百分之百肯定。

我最近才注意到,在我测试过的几款安装了iOS 9.2的iphone上,这个功能开始起作用了。

所以如果你们都能拿出你们的iphone并开始测试它将会很好地看到这个问题是否已经解决了