web-dev-qa-db-ja.com

iPhoneからの画像アップロードはexifデータを削除します

画像をアップロードできるウェブサイトを構築しました。画像がアップロードされると、写真に関する特定の情報が表示されます。コンピューターからの画像のアップロードは問題なく機能し、スマートフォンから画像をアップロードしようとすると問題が発生します。アップロードは成功しましたが、コンピューターからのアップロード時に表示されるデータの大部分が失われたようです。

このコードセクションは、実際にデータを取得して表示するセクションです。

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

何が原因でしょうか?

33
user975343

問題

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

19
nvanesch

写真がiPhoneから電子メールで送信され、Macに保存された場合、exifデータは保持されます。 IMage Captureを介してMacにコピーした場合、exifデータは保持されます。カメラの役割からサービスにアップロードされた場合のみ、アップロード時にexifデータが送信されません。

6
guest

Appleこの機能についての公式声明はありませんが、Appleフォーラムでもこれについて尋ねている人がたくさんいます。実際、報告されていることからネットの周りでは、これはiPhoneからSafariにアップロードするだけでなく、メールで送信された添付ファイルにも起こります。

ただし、この影響を受ける人が多いことは明らかです。 Flickrは大きな被害者のようですが、他にもあります。

幸いなことに、最近では<input type="file">タグの生ファイルデータにアクセスする方法があります。これにより、必要なEXIF情報を取得して非表示のフォームフィールドに配置し、実際のファイルのアップロードとともに送信できます。 jsfiddle from this answer を採用して、それが意味することを紹介しました:

見てください

更新:JavaScriptは役に立ちません

FileReader AP​​I もサニタイズされたバージョンにのみアクセスするため、これは現在の世代のiOSデバイスに望ましい効果をもたらさないようですのファイル。

5
likeitlikeit

別のブラウザ、Opera Miniを試してみたところ、うまくいきました!exifデータをすべて取得しました!

0
Yuri Sidorov

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
}
0
WyHowe

残念ながら、(私の場合のように)iphoneからサーバーにアップロードすると、itamar(op)はIFDO:MAKEを削除します。写真をiPhoneに保存してメールで送信した場合、データはそこにあります。

写真を正しく回転させるには、MAKE情報が必要です。 ORIENTATIONの値はAppleとAndroidであり、MAKEがあれば、コードを適応させることができます。写真を撮りました。

Appleの場合、ユーザーがアップロードするPICデータ情報を選択できるようにする。

  • 保存されたファイル(画像を共有しない)をサーバーの場所にアップロードするコードを作成し、最終的な場所に添付/追加する
  • http://www.transloadit.com のような商用アプリを使用してアップロードする
  • mAKEのEXIFデータに依存するのではなく、データの送信に使用されたデバイスとo/sを見つけることにしました。出発点として「client_agent」を探索します。

このアイデアは、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

0
CliffPR

私は現在iOS 8.1.1を使用していますが、モバイルサファリ経由でアップロードするときに、写真から特定のExifデータをカットするというこの不愉快な振る舞いにも気付きました。次の新規インストールでも同じ動作に気付きました。

  • Opera Miniは
  • Chrome
  • 水星

そのため、私の動作はブラウザに関連する動作ではなく、写真を別のアプリケーションに転送するときのカメラアプリ(Appleによって承認されていない)であると仮定しています。

誰かがこのExifデータの切断に関するAppleからの公式声明を見つけましたか?

0
Robin

また、iPhoneからWindows 7マシン(さまざまなマシンで試してみました)へのiPhone(長年にわたってiOS/iPhoneのコンボがどうであろうと思われない)からのコピーについても同様の問題があります。電話からPCにjpgファイルをコピーすると、少数の写真のEXIF情報が大幅に削除されます。タイムスタンプとGPS情報が間違っていると、非常に迷惑になります。さらに奇妙なのは、MSの写真ギャラリーでjpgを表示し、まだ存在している画像の日付スタンプを見ると、「撮影日」を回復できることです。 Windowsエクスプローラー内のファイルにスタンプが再表示されます。これは奇妙な振る舞いに加えてより奇妙な振る舞いであり、起動するのが非常に面倒です。 PGの修正が完了するまでは、画像の回転やその他の編集を行わないでください。そうしないと、スタンプの日付を取り戻すことができなくなります。

詳細情報:iTunesがインストールされていません。これは他の関連しない問題を引き起こすためです。

つまり、iPhoneをPCに接続し、Windowsエクスプローラーを介してjpgファイルをコピーすると、一部のファイルはEXIF情報を失うようです。

0
Cyclonique