画像をアップロードできるウェブサイトを構築しました。画像がアップロードされると、写真に関する特定の情報が表示されます。コンピューターからの画像のアップロードは問題なく機能し、スマートフォンから画像をアップロードしようとすると問題が発生します。アップロードは成功しましたが、コンピューターからのアップロード時に表示されるデータの大部分が失われたようです。
このコードセクションは、実際にデータを取得して表示するセクションです。
$location = $_FILES["pic"]["tmp_name"];
$data = exif_read_data($location);
var_dump($data);
var_dump($data)
は、実際にコンピューターとスマートフォンのさまざまなデータをダンプします。
編集:どうやらAndoroidスマートフォンで問題なく動作するようです。iPhoneから画像をアップロードしようとすると問題が発生します
たとえば、computer uploadの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
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)
}
computervar_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 results 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のバグではなく、実際には機能です。
主な理由の1つAndroidユーザーはiphoneが好きではなく、iphoneユーザーはAndroidが好きではありません。これは、iphoneが非常に制限されているためです(変更、変更などの自由に関して) )。ダウンロードしたアプリを実行したり、設定へのアクセスを制限したりすることはできません。
これは、Apple戦略はフェイルセーフ製品を作成することです。「奇妙なことができなければ、奇妙なことは起こりません」。考えられるあらゆる方法でユーザーを保護しようとします。また、画像をアップロードする際にユーザーを保護します。exifには、ユーザーのプライバシーを損なう可能性のあるデータがある場合があります。あなたは上司と病気で報告しました)。
したがって、基本的に、すべてのexifデータを削除することは安全対策です。私自身と他の多くの人々はこの戦略に同意していませんが、残念ながらそれについてできることは何もありません。
解決策
更新:これは機能しません。 (この情報をlikeitlikeitに感謝します)
幸いなことに、この問題を回避できます。 Javascriptが役に立ちます。 JavaScriptを使用すると、exifデータを読み取り、追加のPOST data。
注意してください:このソリューションは別の開発者から提示されたもので、まだテストされていません。
ソース
信頼できる情報源を求めています。残念ながら、Appleはいつものように話していないため、私が持っている情報はすべて伝聞です。
おそらく、私が提示できるより信頼できる情報源の1つは、根本的な原因がexifを削除するモバイルサファリであることを確認するflickrのスタッフです。 http://www.flickr.com/help/forum/en-us/72157632100391901/#reply7215763213595681
写真がiPhoneから電子メールで送信され、Macに保存された場合、exifデータは保持されます。 IMage Captureを介してMacにコピーした場合、exifデータは保持されます。カメラの役割からサービスにアップロードされた場合のみ、アップロード時にexifデータが送信されません。
Appleこの機能についての公式声明はありませんが、Appleフォーラムでもこれについて尋ねている人がたくさんいます。実際、報告されていることからネットの周りでは、これはiPhoneからSafariにアップロードするだけでなく、メールで送信された添付ファイルにも起こります。
ただし、この影響を受ける人が多いことは明らかです。 Flickrは大きな被害者のようですが、他にもあります。
幸いなことに、最近では<input type="file">
タグの生ファイルデータにアクセスする方法があります。これにより、必要なEXIF情報を取得して非表示のフォームフィールドに配置し、実際のファイルのアップロードとともに送信できます。 jsfiddle from this answer を採用して、それが意味することを紹介しました:
見てください 。
FileReader
API もサニタイズされたバージョンにのみアクセスするため、これは現在の世代のiOSデバイスに望ましい効果をもたらさないようですのファイル。
別のブラウザ、Opera Miniを試してみたところ、うまくいきました!exifデータをすべて取得しました!
IPhone 6でモバイル画像のアップロードをテストしています。 iPhoneのオリエンテーションに対応します。 2種類の画像アップロードの準備ができている必要があります。フロントカメラとバックカメラ。正面の* selfieカメラから方向を取得するには、次の手順を実行する必要があります。まず、サーバー上の保存先フォルダーに画像を保存します。
$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
}
残念ながら、(私の場合のように)iphoneからサーバーにアップロードすると、itamar(op)はIFDO:MAKEを削除します。写真をiPhoneに保存してメールで送信した場合、データはそこにあります。
写真を正しく回転させるには、MAKE情報が必要です。 ORIENTATIONの値はAppleとAndroidであり、MAKEがあれば、コードを適応させることができます。写真を撮りました。
Appleの場合、ユーザーがアップロードするPICデータ情報を選択できるようにする。
このアイデアは、TRANSLOADITへのアップロードの結果のJSONを見て得たものです。明らかに必要なデータがあります:
"client_agent": "Mozilla/5.0(iPad; Mac OS XのようなCPU OS 7_1_1)AppleWebKit/537.51.1(GHTMLのようなKHTML)CriOS/34.0.1847.18 Mobile/11D201 Safari/9537.53"、
彼らがo/sとデバイスを「見る」ことができるなら、私たちもできる。
そのデータを取得したら、pic EXIFに追加して他の場所で使用できます。
これが役に立てば幸いです。
編集:「echo $ _SERVER ['HTTP_USER_AGENT']。 "\ n\n";」を使用する場合を説明するためのWindows PCからのデータ
FROM 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; Mac OS XのようなCPU OS 7_1_1)AppleWebKit/537.51.1(KHTML、Geckoのような)CriOS/34.0.1847.18 Mobile/11D201 Safari/9537.53」、
編集:php.netにrferenceを追加し、ブラウザーを取得: http://www.php.net/manual/en/function.get-browser.php
私は現在iOS 8.1.1を使用していますが、モバイルサファリ経由でアップロードするときに、写真から特定のExifデータをカットするというこの不愉快な振る舞いにも気付きました。次の新規インストールでも同じ動作に気付きました。
そのため、私の動作はブラウザに関連する動作ではなく、写真を別のアプリケーションに転送するときのカメラアプリ(Appleによって承認されていない)であると仮定しています。
誰かがこのExifデータの切断に関するAppleからの公式声明を見つけましたか?
また、iPhoneからWindows 7マシン(さまざまなマシンで試してみました)へのiPhone(長年にわたってiOS/iPhoneのコンボがどうであろうと思われない)からのコピーについても同様の問題があります。電話からPCにjpgファイルをコピーすると、少数の写真のEXIF情報が大幅に削除されます。タイムスタンプとGPS情報が間違っていると、非常に迷惑になります。さらに奇妙なのは、MSの写真ギャラリーでjpgを表示し、まだ存在している画像の日付スタンプを見ると、「撮影日」を回復できることです。 Windowsエクスプローラー内のファイルにスタンプが再表示されます。これは奇妙な振る舞いに加えてより奇妙な振る舞いであり、起動するのが非常に面倒です。 PGの修正が完了するまでは、画像の回転やその他の編集を行わないでください。そうしないと、スタンプの日付を取り戻すことができなくなります。
詳細情報:iTunesがインストールされていません。これは他の関連しない問題を引き起こすためです。
つまり、iPhoneをPCに接続し、Windowsエクスプローラーを介してjpgファイルをコピーすると、一部のファイルはEXIF情報を失うようです。