php आईफोन स्ट्रिप्स exif डेटा से छवि अपलोड करें




jquery iphone (8)

समस्या

यह सही है कि आईफोन (आईपैड, इत्यादि, मैं इसे अभी से आईफोन कहूंगा) स्ट्रिप्स एक्सआईएफ डेटा। यह आईफोन पर भी एक बग नहीं है बल्कि वास्तव में एक सुविधा है।

मुख्य कारणों में से एक एंड्रॉइड उपयोगकर्ताओं को पसंद नहीं है आईफोन और आईफोन उपयोगकर्ताओं को एंड्रॉइड पसंद नहीं है, क्योंकि आईफोन बहुत सीमित है (बदलने की स्वतंत्रता के मामले में, परिवर्तन, आदि)। आप केवल डाउनलोड किए गए ऐप्स नहीं चला सकते हैं, सेटिंग्स तक सीमित पहुंच सकते हैं आदि।

ऐसा इसलिए है क्योंकि सेब रणनीति एक असफल-सुरक्षित उत्पाद बनाना है। "अगर आप अजीब चीजें नहीं कर सकते हैं, तो अजीब चीजें नहीं होंगी।" उपयोगकर्ता को हर तरह से कल्पना करने की कोशिश करता है। यह छवियों को अपलोड करते समय उपयोगकर्ता की भी सुरक्षा करता है। Exif में डेटा हो सकता है जो उपयोगकर्ताओं की गोपनीयता को नुकसान पहुंचा सकता है। जीपीएस निर्देशांक जैसी चीजें, लेकिन एक टाइमस्टैंप भी उपयोगकर्ता को चोट पहुंचा सकता है (कल्पना करें कि आप बॉस के साथ बीमार होने की रिपोर्ट में एक टाइमस्टैम्प के साथ समुद्र तट चित्र अपलोड कर रहे हैं)।

तो मूल रूप से यह सभी exif डेटा पट्टी करने के लिए एक सुरक्षा उपाय है। स्वयं और कई अन्य लोग इस रणनीति से सहमत नहीं हैं, लेकिन दुर्भाग्य से हम इसके बारे में कुछ भी नहीं कर सकते हैं।

समाधान

अद्यतन: यह काम नहीं करता है । (इस जानकारी के लिए धन्यवाद पसंद है)

सौभाग्य से आप इस समस्या के आसपास हो सकते हैं। जावास्क्रिप्ट बचाव के लिए आता है। जावास्क्रिप्ट के साथ आप एक्सिफ डेटा पढ़ सकते हैं और कुछ अतिरिक्त पोस्ट डेटा जोड़ कर इसे अपने साथ फोटो भेज सकते हैं।

कृपया ध्यान दें : यह समाधान मुझे किसी अन्य डेवलपर द्वारा प्रस्तुत किया गया था और अभी तक परीक्षण नहीं किया गया है।

सूत्रों का कहना है

आप विश्वसनीय स्रोत मांग रहे हैं। दुर्भाग्य से उन्हें खोजने में मुश्किल होती है क्योंकि सेब हमेशा के रूप में बात नहीं कर रहा है और इसलिए मेरे पास सभी जानकारी सुनवाई है।

शायद मैं प्रस्तुत कर सकने वाले अधिक विश्वसनीय स्रोतों में से एक है झिलमिलाहट कर्मचारियों में से एक है जो पुष्टि करता है कि मूल कारण मोबाइल सफारी exif अलग करना है। http://www.flickr.com/help/forum/en-us/72157632100391901/#reply72157632135956813

मैंने एक वेबसाइट बनाई है जो छवि अपलोड करने की अनुमति देता है और एक बार छवि अपलोड होने के बाद, तस्वीर के बारे में कुछ विशिष्ट जानकारी प्रदर्शित होती है। कंप्यूटर से चित्र अपलोड करना ठीक काम करता है, समस्या तब आती है जब मैं एक स्मार्टफोन से एक छवि अपलोड करने की कोशिश कर रहा हूं। अपलोड सफलता लेकिन यह कंप्यूटर से अपलोड करते समय प्रदर्शित होने वाले डेटा का एक बड़ा हिस्सा प्रतीत होता है।

यह कोड अनुभाग वह है जो वास्तव में डेटा को पुनर्प्राप्त और प्रदर्शित करता है:

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

var_dump($data) वास्तव में कंप्यूटर और स्मार्टफ़ोन में अलग-अलग डेटा डंप करता है।

संपादित करें: जाहिर है यह एंड्रॉइड स्मार्टफ़ोन के साथ ठीक काम करता है, समस्या तब होती है जब मैं आईफोन से छवियों को अपलोड करने का प्रयास करता हूं

उदाहरण के लिए, कंप्यूटर अपलोड से 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) } }

यहां आईफोन परिणाम 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>

इसका क्या कारण हो सकता है?


मेरे पास एक आईफोन से कॉपी करने वाली एक ही समस्या है (विंडोज़ 7 मशीन (कई मशीनों पर भी कोशिश की गई) के लिए आईओएस / आईफोन कॉम्बो जो कुछ भी हो रहा है, उससे कोई फर्क नहीं पड़ता)। अगर मैं फोन से पीसी पर एक जेपीजी फ़ाइल कॉपी करता हूं तो चित्रों की एक बड़ी अल्पसंख्यक में उनकी EXIF ​​जानकारी गंभीर रूप से हटा दी जाती है। जब समय टिकटें और जीपीएस जानकारी भटक जाती है तो बहुत परेशान होता है। और भी अजीब बात यह है कि अगर मैं एमएस की पिक्चर गैलरी में जेपीजी देखता हूं और छवि की तारीख को अभी भी मौजूद है, तो मैं 'डेट ले लिया' पुनर्प्राप्त कर सकता हूं - तारीख को एक बार बदलें और फिर एक और तारीख को वापस दर्ज करें विंडोज एक्सप्लोरर के भीतर फाइल में फिर से दिखाई देने वाली स्टैंप ली जाएगी। यह अजीब व्यवहार के शीर्ष पर और अजीब व्यवहार है जो बूट करने के लिए बहुत परेशान है। पीजी फिक्स के बाद तक आपको छवियों या किसी अन्य संपादन पर किसी भी घूर्णन को नहीं करना चाहिए या आप उस तारीख से ली गई तारीख को पुनः प्राप्त नहीं कर पाएंगे।

अधिक जानकारी के लिए: मेरे पास आईट्यून्स इंस्टॉल नहीं हैं क्योंकि इससे अन्य गैर-संबंधित मुद्दों का कारण बनता है।

तो रिकैक करने के लिए - आईफोन एक पीसी से जुड़ा हुआ है, विंडोज एक्सप्लोरर के माध्यम से जेपीजी फाइलों की प्रतिलिपि बना रहा है और कुछ फाइलें जाहिर तौर पर अपनी EXIF ​​जानकारी खो देंगे।


मैंने अभी एक और ब्राउज़र, ओपेरा मिनी की कोशिश की, और यह काम किया! मेरे सभी exif डेटा मिला!


मुझे लगता है कि अब आईओएस के नए संस्करण (मैं बिल्कुल ठीक नहीं हूं) के साथ हल कर चुका हूं। मैं इस बारे में 100% निश्चित नहीं हो सकता।

मैंने हाल ही में देखा है कि इसने परीक्षण किए गए कुछ अलग-अलग iPhones पर काम करना शुरू कर दिया है जिनके पास आईओएस 9.2 स्थापित है।

तो यदि आप सभी iPhones को चाबुक कर सकते हैं और परीक्षण शुरू कर सकते हैं तो यह देखना अच्छा होगा कि यह हल हो गया है या नहीं।


अगर तस्वीर को आईफोन से ईमेल किया गया है और मैक में सहेजा गया है, तो एक्सिफ डेटा संरक्षित है। यदि मैक पर इमेज कैप्चर के माध्यम से इसकी प्रतिलिपि बनाई गई है, तो एक्सिफ डेटा संरक्षित है। केवल अगर कैमरा भूमिका से किसी सेवा पर अपलोड किया गया है तो अपलोड के साथ डेटा नहीं भेजा गया है।


मोबाइल छवि अपलोड के लिए आईफोन 6 पर परीक्षण किया गया। आईफोन के लिए अभिविन्यास को पूरा करने के लिए। आपको दो प्रकार के छवि अपलोड के लिए तैयार होना चाहिए। फ्रंट कैमरा और बैक कैमरा। फ्रंट * सेल्फी कैमरे से अभिविन्यास प्राप्त करने के लिए आपको निम्न कार्य करना होगा। सबसे पहले छवि को अपने गंतव्य फ़ोल्डर में सर्वर पर संग्रहीत करें।

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

यह आपको तदनुसार घुमाने के लिए अभिविन्यास संख्या देगा। बैक कैमरे के लिए आप सीधे स्रोत यूआरएल से पढ़ सकते हैं। फ़ाइल अपलोड फॉर्म से पोस्ट की गई। पहले स्टोर करने के बिना EXIF ​​पढ़ें

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

मैं वर्तमान में आईओएस 8.1.1 का उपयोग कर रहा हूं और मैंने मोबाइल सफारी के माध्यम से अपलोड करते समय फ़ोटो से कुछ एक्सिफ डेटा काटने का यह अनोखा व्यवहार भी देखा है। मैंने एक ही व्यवहार को एक नई स्थापना के साथ देखा:

  • ओपेरा मिनी
  • क्रोम
  • पारा

तो मेरी धारणा यह है कि व्यवहार ब्राउज़र से संबंधित नहीं है, लेकिन फोटो को दूसरे एप्लिकेशन में स्थानांतरित करते समय कैमरा ऐप (एप्पल द्वारा अधिकृत नहीं)।

क्या किसी को इस एक्सिफ डेटा काटने के लिए ऐप्पल से आधिकारिक बयान मिला है?


ऐप्पल से इस फीचर के बारे में कोई आधिकारिक वक्तव्य नहीं है, हालांकि ऐप्पल मंचों पर भी कई लोग इसके बारे में पूछ रहे हैं। असल में, नेट के आसपास की रिपोर्ट के बारे में, यह न केवल आईफोन से सफारी में अपलोड करने के लिए होता है, बल्कि ईमेल संलग्नक के लिए भी होता है।

हालांकि, यह स्पष्ट है कि इस से प्रभावित बहुत से लोग हैं। फ्लिकर एक प्रमुख शिकार प्रतीत होता है, लेकिन अन्य भी हैं।

सौभाग्य से, आजकल <input type="file"> टैग के लिए कच्चे फ़ाइल डेटा तक पहुंचने के तरीके हैं। यह आपको अपनी इच्छित EXIF ​​जानकारी लेने की अनुमति देता है, इसे एक छिपे हुए फॉर्म फ़ील्ड में रखता है, और इसे वास्तविक फ़ाइल अपलोड के साथ भेजता है। मैंने इस जवाब से एक jsfiddle अनुकूलित करने के लिए अनुकूलित किया कि मेरा क्या मतलब है:

देखो

अद्यतन: जावास्क्रिप्ट कोई मदद नहीं है

ऐसा लगता है कि वर्तमान-पीढ़ी के आईओएस उपकरणों पर वांछित प्रभाव नहीं है, क्योंकि FileReader एपीआई को केवल फ़ाइल के एक sanitized संस्करण तक पहुंच प्राप्त होती है







exif