type and accept php jquery iphone file-upload exif

php - and - take photo html5 mobile



Carga de imágenes desde las tiras de iphone exif data (9)

¡Acabo de probar con otro navegador, Opera Mini, y funcionó! ¡Obtuve todos mis datos exif!

Creé un sitio web que permite la carga de imágenes y una vez que se carga una imagen, se muestra información específica sobre la misma. Cargar imágenes desde computadoras funciona bien, el problema surge cuando intento cargar una imagen desde un teléfono inteligente. El éxito de la carga, pero parece que falta una parte importante de los datos que se muestran al cargar desde la computadora.

Esta sección de código es la que realmente recupera y muestra los datos:

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

el var_dump($data) realidad volca datos diferentes en computadoras y teléfonos inteligentes.

EDITAR: Aparentemente funciona bien con los teléfonos inteligentes Andoroid, el problema solo aparece cuando intento subir imágenes desde el iPhone

Por ejemplo, var_dump desde la carga de la computadora :

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 desde la carga del teléfono inteligente :

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) }

Aquí está la computadora 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) } }

Aquí están los resultados de 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) } }

EDITAR: Aquí está el código HTML del formulario de carga:

<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>

¿Qué podría causarlo?


Actualmente estoy usando iOS 8.1.1 y también noté este comportamiento desagradable al cortar ciertos datos Exif de las fotos cuando se cargan a través de un safari móvil. Noté el mismo comportamiento con una nueva instalación de:

  • Mini Opera
  • Cromo
  • Mercurio

Así que mi suposición es que el comportamiento no está relacionado con el navegador, pero es la aplicación de la cámara cuando se transfiere la foto a otra aplicación (no autorizada por Apple).

¿Alguien encontró una declaración oficial de Apple para este recorte de datos Exif?


Creo que esto se ha resuelto ahora con la versión más nueva (no sé exactamente cuál) de iOS. No puedo estar 100% seguro de esto.

Me acabo de dar cuenta recientemente de que esto ha comenzado a funcionar en algunos iPhones diferentes que he probado que tienen iOS 9.2 instalado.

Entonces, si todos ustedes pudieran sacarse sus iPhones y comenzar a probarlo, sería genial ver si esto se ha resuelto.


Desafortunadamente, itamar (op) si carga de iphone a un servidor (como es mi caso), se elimina el IFDO: MAKE. Si pic se guarda en iphone y se envía por correo electrónico, la información está allí.

Necesito la información de HACER para rotar las fotos correctamente. El valor de ORIENTACIÓN es diferente para Apple y Android, y si tuviera el código MAKE podría codificar para adaptarlo. No puedo entender cuáles podrían ser las preocupaciones sobre el secreto al saber qué dispositivo tomó la fotografía.

A falta de Apple, el usuario puede seleccionar la información de datos PIC que se cargará, tal vez en AJUSTES, posibles soluciones:

  • creando código para CARGAR el archivo guardado (no compartir la imagen) a la ubicación del servidor y luego adjuntar / agregar al lugar final
  • usando aplicaciones comerciales para cargar, como http://www.transloadit.com
  • en lugar de depender de los datos EXIF ​​de MAKE, decidí averiguar el dispositivo y las / s utilizadas para enviar datos. Explorará "client_agent" como punto de partida.

Acabo de obtener esta idea al ver que RESULT JSON se cargó en TRANSLOADIT. Claramente tiene los datos que necesitamos:

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

Si pueden "ver" el o / sy el dispositivo, nosotros también podemos.

Si obtenemos esa información, entonces puede agregarse a la imagen EXIF ​​y usarse en otro lugar.

Espero que esto haya ayudado.

EDITAR: datos de Windows PC para ilustrar cuando se usa "echo $ _SERVER [''HTTP_USER_AGENT'']." / N / n ";"

DESDE PC: Mozilla / 5.0 (Windows NT 6.2; WOW64) AppleWebKit / 537.36 (KHTML, como Gecko) Chrome / 35.0.1916.114 Safari / 537.36 Archivo

DESDE IPAD: "Mozilla / 5.0 (iPad; CPU OS 7_1_1 como Mac OS X) AppleWebKit / 537.51.1 (KHTML, como Gecko) CriOS / 34.0.1847.18 Móvil / 11D201 Safari / 9537.53",

EDITAR: mayor referencia a php.net y obtener navegador: http://www.php.net/manual/en/function.get-browser.php


Estado probando en el iphone 6 para cargar imágenes móviles. Para atender la orientación para iPhone. Debe estar listo para los dos tipos de carga de imágenes. La cámara frontal y la cámara trasera. Para obtener la orientación de la cámara frontal * selfie, debe hacer lo siguiente. Primero guarde la imagen en su carpeta de destino en el servidor.

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

A partir de ahí, lee el EXIF ​​del archivo de destino creado

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

Esto le dará el número de orientación para girarlo en consecuencia. En cuanto a la cámara trasera, puede leer directamente desde la URL de origen. El archivo publicado desde el formulario de carga. sin tener que almacenar primero, entonces lea el EXIF

$exif = exif_read_data($source_url); if(!empty($exif[''Orientation''])) { //rotate accordingly }


No hay declaraciones oficiales de Apple sobre esta función, aunque hay muchas personas que preguntan sobre esto incluso en los foros de Apple. De hecho, de lo que se informa en la red, esto no solo sucede con las cargas en Safari desde el iPhone, sino también con los archivos adjuntos enviados por correo electrónico.

Sin embargo, está claro que hay muchas personas afectadas por esto. Flickr parece ser una gran víctima, pero también hay otros.

Afortunadamente, hoy en día hay formas de acceder a los datos de archivo sin formato para las etiquetas <input type="file"> . Esto le permite tomar la información EXIF ​​que desee, colocarla en un campo de formulario oculto y enviarla junto con la carga real del archivo. jsfiddle un jsfiddle de esta respuesta para mostrar lo que quiero decir con eso:

Eche un vistazo .

ACTUALIZACIÓN: JavaScript no es de ayuda

Esto parece no tener el efecto deseado en los dispositivos iOS de generación actual, ya que la API de FileReader también solo tiene acceso a una versión desinfectada del archivo.


También tengo un problema similar al copiar desde un iPhone (no parece importar qué combo iOS / iPhone ha estado sucediendo durante años) a una máquina con Windows 7 (también probado en varias máquinas). Si copio un archivo jpg del teléfono a la PC, una gran minoría de imágenes ha eliminado su información EXIF. Lo cual es muy molesto cuando las marcas de tiempo y la información del GPS van por mal camino. Lo que es aún más extraño es que puedo recuperar la ''Fecha de toma'' si veo el jpg en la Galería de imágenes de MS y miro el sello de fecha de la imagen que todavía está presente - Cambie la fecha arriba y luego vuelva a ingresar una y la fecha el sello tomado reaparecerá en el archivo dentro del Explorador de Windows. Este es un comportamiento más extraño además de un comportamiento extraño y muy molesto para arrancar. No debe hacer ninguna rotación en las imágenes o en cualquier otra edición hasta que no haya sido después de la corrección de PG o no podrá reclamar la fecha del sello.

Para obtener más información: no tengo iTunes instalado ya que esto causa otros problemas no relacionados.

Entonces, para recapitular: iPhone conectado a una PC, copiando archivos jpg a través de Windows Explorer y algunos de los archivos aparentemente perderán su información EXIF.


si la foto se envía por correo electrónico desde el iPhone y se guarda en un mac, se conservan los datos exif. Si se copia a través de IMage Capture a mac, se conservan los datos exif. Solo si se carga en un servicio desde la función de cámara, los datos exif no se envían con la carga.


El problema

Es correcto que el iphone (ipad, etc., lo llamo iPhone a partir de ahora) quita los datos exif. Esto tampoco es un error en el iPhone, pero en realidad es una característica.

Una de las razones principales por las que a los usuarios de Android no les gusta que los usuarios de iphone y iphone no les gusten los androides, es porque el iphone es muy limitado (en términos de libertad para cambiar, alterar, etc.). No puedes simplemente ejecutar aplicaciones descargadas, tener acceso limitado a la configuración, etc.

Esto se debe a que la estrategia de Apple es crear un producto a prueba de fallas. "Si no puedes hacer cosas extrañas, cosas extrañas no sucederán". Intenta proteger al usuario de todas las formas imaginables. También protege al usuario cuando carga imágenes. En el exif puede haber datos que pueden dañar la privacidad de los usuarios. Cosas como coordenadas de GPS, pero incluso una marca de tiempo puede dañar a un usuario (imagine que está cargando una foto de playa con una marca de tiempo desde el momento en que informó que estaba enfermo con el jefe).

Entonces, básicamente, es una medida de seguridad eliminar todos los datos exif. Yo y muchas otras personas no estamos de acuerdo con esta estrategia, pero lamentablemente no hay nada que podamos hacer al respecto.

La solución

Actualización: Esto no funciona . (gracias likeitlikeit por esta información)

Afortunadamente puedes evitar este problema. Javascript viene al rescate. Con javascript puede leer los datos de exif y enviarlos con su foto agregando algunos datos POST adicionales.

tenga en cuenta : esta solución me la presentó otro desarrollador y todavía no se ha probado.

Fuentes

Usted está pidiendo fuentes creíbles. Desafortunadamente son difíciles de encontrar ya que la manzana no está hablando como siempre y, por lo tanto, toda la información que tengo es de oídas.

Tal vez una de las fuentes más confiables que puedo presentar es uno de los miembros del personal de flickr que confirma que la causa principal es el safari móvil quitando el exilio. http://www.flickr.com/help/forum/en-us/72157632100391901/#reply72157632135956813