Я создал веб-сайт, который позволяет загружать изображения, и как только изображение загружается, отображается определенная информация о фотографии. Загрузка фотографий с компьютеров работает очень хорошо, проблема возникает, когда я пытаюсь загрузить изображение с смартфона. Успех загрузки, но, похоже, большая часть данных, отображаемых при загрузке с компьютера, отсутствует.
Этот раздел кода является тем, который фактически извлекает и отображает данные:
$location = $_FILES["pic"]["tmp_name"]; $data = exif_read_data($location); var_dump($data);
var_dump($data)
фактически сбрасывает разные данные на компьютерах и смартфонах.
EDIT: По-видимому, он отлично работает с Android-телефонами Andoroid, проблема возникает только при попытке загрузить изображения с 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) } }
EDIT: Вот код 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, а на самом деле функция.
Одна из основных причин, по которой пользователи андроидов не любят пользователей iphone и iphone, не любят андроидов, потому что iphone очень ограничен (с точки зрения свободы на изменение, изменение и т. Д.). Вы не можете запускать загруженные приложения, иметь ограниченный доступ к настройкам и т. Д.
Это связано с тем, что стратегия Apple заключается в создании отказобезопасного продукта. «Если вы не можете делать странные вещи, странных вещей не будет». Он пытается защитить пользователя всеми возможными способами. Он также защищает пользователя при загрузке изображений. В exif могут быть данные, которые могут повредить конфиденциальности пользователей. Такие вещи, как GPS-координаты, но даже временная метка может повредить пользователя (представьте, что вы загружаете изображение на пляже с отметкой времени с того момента, как вы сообщили в больнице с боссом).
Так что в основном это безопасность, чтобы удалить все данные exif. Я и многие другие люди не согласны с этой стратегией, но мы ничего не можем с этим сделать, к сожалению.
Решение
Обновление: это не работает . (спасибо likeitlikeit для этой информации)
К счастью, вы можете обойти эту проблему. Javascript приходит на помощь. С помощью javascript вы можете прочитать данные exif и отправить его с вашей фотографией, добавив некоторые дополнительные данные POST.
обратите внимание : это решение было представлено мне другим разработчиком и еще не проверено.
источники
Вы запрашиваете достоверные источники. К сожалению, их трудно найти, поскольку яблоко не говорит, как всегда, и поэтому вся информация у меня есть слухи.
возможно, одним из наиболее надежных источников, которые я могу представить, является одним из сотрудников персонала flickr, который подтверждает, что основной причиной является мобильное сафари, снимающее exif. http://www.flickr.com/help/forum/en-us/72157632100391901/#reply72157632135956813
Официальных заявлений Apple об этой функции нет, хотя об этом даже говорят многие люди на форумах Apple. Фактически, из того, что сообщается в сети, это происходит не только с загрузкой в Safari с iPhone, но и для вложений по электронной почте.
Тем не менее, ясно, что это очень много людей. Flickr, кажется, главная жертва, но есть и другие.
К счастью, в настоящее время существуют способы доступа к необработанным файлам данных для тегов <input type="file">
. Это позволяет вам взять информацию EXIF, которую вы хотите, поместить в скрытое поле формы и отправить вместе с фактической загрузкой файла. Я адаптировал jsfiddle из этого ответа, чтобы продемонстрировать, что я имею в виду:
Посмотрите .
Это, похоже, не оказывает желаемого эффекта на устройства iOS текущего поколения, поскольку API FileReader
также получает доступ только к дезинфицированной версии файла.
если pic отправляется по электронной почте из iphone и сохраняется на Mac, данные exif сохраняются. Если его копировать с помощью IMage Capture на Mac, данные exif сохраняются. Только при загрузке в службу из ролика камеры exif данные не отправляются с загрузкой.
К сожалению, itamar (op), если вы загружаете с iphone на сервер (как и в моем случае), IFDO: MAKE лишается. Если pic сохранен на iphone и отправлен по электронной почте, данные есть.
Мне нужна информация MAKE, чтобы правильно повернуть фотографии. Значение ORIENTATION отличается для Apple и Android, и если бы у меня был MAKE, я мог бы код адаптироваться. Не могу понять, что может означать секретность, зная, какое устройство взяло картину.
За исключением Apple, позволяющего пользователю выбирать информацию о данных PIC для загрузки, возможно, в SETTINGS, возможные решения:
Просто получил эту идею от просмотра RESULT JSON от загрузки в TRANSLOADIT. Он явно имеет необходимые нам данные:
«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 и использовать в другом месте.
Надеюсь, это помогло.
EDIT: данные с ПК с Windows, чтобы проиллюстрировать при использовании «echo $ _SERVER ['HTTP_USER_AGENT']." \ N \ n ";"
ОТ ПК: Mozilla / 5.0 (Windows NT 6.2, WOW64) AppleWebKit / 537.36 (KHTML, например, Gecko) Chrome / 35.0.1916.114 Safari / 537.36 Файл
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",
EDIT: добавлена разница в php.net и получить браузер: http://www.php.net/manual/en/function.get-browser.php
Я просто попробовал другой браузер, Opera Mini, и это сработало! Получил все мои данные exif!
В настоящее время я использую iOS 8.1.1, и я также заметил это несовместимое поведение при отключении некоторых данных Exif от фотографий при загрузке через мобильное сафари. Я заметил такое же поведение при новой установке:
Поэтому я полагаю, что поведение не связано с браузером, но его приложение камеры при передаче фотографии в другое приложение (не разрешено Apple).
Кто-нибудь нашел официальное заявление от Apple для этой резки данных Exif?
У меня также есть аналогичная проблема с копированием с iPhone (не похоже на то, что iOS / iPhone комбо, как это происходило в течение многих лет) на машину Windows 7 (также на разных машинах). Если я скопирую файл jpg с телефона на ПК, значительное меньшинство фотографий имеет информацию EXIF, сильно удаленную. Что очень раздражает, когда метки времени и информация GPS сбиваются с пути. Что еще более странно, так это то, что я могу восстановить «Date Taken», если я просмотрю jpg в Картинной галерее MS и посмотрю на дату, отмеченную датой изображения, которая все еще присутствует. – Измените дату вверх и введите, затем нажмите вниз и дате сделанная печать, снова появится в файле в Проводнике Windows. Это более странное поведение поверх странного поведения и очень раздражает для загрузки. Вы не должны делать поворот на изображениях или любом другом редактировании в противном случае до тех пор, пока не исправит PG или вы не сможете вернуть штамп даты.
Для получения дополнительной информации: у меня нет iTunes, так как это вызывает другие неполученные проблемы.
Итак, чтобы напомнить – iPhone подключен к ПК, скопируйте файлы jpg через проводник Windows, и некоторые из файлов, по-видимому, потеряют информацию о 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-адреса. Файл отправлен из формы загрузки. без сохранения 1-го, тогда прочитайте EXIF
$exif = exif_read_data($source_url); if(!empty($exif['Orientation'])) { //rotate accordingly }
Я думаю, что это было разрешено сейчас с более новой версией (я не совсем такой) iOS. Я не могу быть уверен в этом на 100%.
Недавно я только что заметил, что это начало работать с несколькими различными Iphones, которые я тестировал, которые установили iOS 9.2.
Поэтому, если бы вы все могли взломать ваши iPhone и начать тестирование, было бы здорово увидеть, было ли это разрешено.