अपलोड से पहले जावास्क्रिप्ट के साथ फ़ाइल MIME प्रकार की जांच कैसे करें?


177

मैंने इसे और इस प्रश्न को पढ़ा है जो यह सुझाव देता है कि MIME प्रकार की फाइल को क्लाइंट साइड पर जावास्क्रिप्ट का उपयोग करके जांचा जा सकता है। अब, मैं समझता हूं कि वास्तविक सत्यापन अभी भी सर्वर साइड पर किया जाना है। मैं सर्वर संसाधन के अनावश्यक अपव्यय से बचने के लिए क्लाइंट साइड चेकिंग करना चाहता हूं।

यह जांचने के लिए कि क्या यह क्लाइंट की तरफ से किया जा सकता है, मैंने एक JPEGपरीक्षण फ़ाइल का एक्सटेंशन बदल दिया .pngऔर अपलोड के लिए फ़ाइल का चयन किया। फ़ाइल भेजने से पहले, मैंने जावास्क्रिप्ट कंसोल का उपयोग करके फ़ाइल ऑब्जेक्ट को क्वेरी किया:

document.getElementsByTagName('input')[0].files[0];

यह वही है जो मुझे क्रोम 28.0 पर मिलता है:

फ़ाइल {webkitRelativePath: "", lastModifiedDate: Tue 16 अक्टूबर 2012 10:00:00 GMT + 0000 (UTC), नाम: "test.png", प्रकार: "छवि / png", आकार: 500055…}

यह उस प्रकार को दिखाता है image/pngजो यह दर्शाता है कि MIME प्रकार के बजाय फ़ाइल एक्सटेंशन के आधार पर जाँच की जाती है। मैंने फ़ायरफ़ॉक्स 22.0 की कोशिश की और यह मुझे वही परिणाम देता है। लेकिन W3C कल्पना के अनुसार , MIME सूँघना लागू किया जाना चाहिए।

क्या मुझे यह कहने का अधिकार है कि फिलहाल जावास्क्रिप्ट के साथ MIME प्रकार की जांच करने का कोई तरीका नहीं है? या क्या मैं कुछ न कुछ भूल रहा हूं?


5
I want to perform a client side checking to avoid unnecessary wastage of server resource.मुझे समझ में नहीं आता कि आप यह क्यों कहते हैं कि सत्यापन सर्वर साइड पर किया जाना है, लेकिन फिर आप सर्वर संसाधनों को कम करना चाहते हैं। स्वर्ण नियम: उपयोगकर्ता इनपुट पर कभी भरोसा न करें । क्लाइंट साइड पर MIME प्रकार की जाँच करने का क्या मतलब है यदि आप तब सर्वर साइड पर कर रहे हैं। निश्चित रूप से यह " ग्राहक संसाधन का अनावश्यक अपव्यय " है?
इयान क्लार्क

7
क्लाइंट-साइड में बेहतर फ़ाइल प्रकार की जाँच / प्रतिक्रिया प्रदान करना एक अच्छा विचार है। हालाँकि, जैसा कि आपने कहा है, ब्राउज़र केवल वस्तुओं के typeलिए संपत्ति के मूल्य का निर्धारण करते समय फ़ाइल एक्सटेंशन पर भरोसा करते Fileहैं। उदाहरण के लिए, वेबकिट स्रोत कोड इस सच्चाई को प्रकट करता है। फाइलों में "मैजिक बाइट्स" की तलाश में अन्य चीजों के साथ-साथ फाइलों के ग्राहक-पक्ष की सटीक पहचान करना संभव है। मैं वर्तमान में एक MIT लाइब्रेरी पर काम कर रहा हूं (मेरे पास खाली समय बहुत कम है) जो बस यही करेगा। यदि आप मेरी प्रगति में रुचि रखते हैं, तो github.com/rnicholus/determinater पर एक नज़र डालें ।
रे निकोलस

32
@IanClark, मुद्दा यह है कि यदि फ़ाइल एक अमान्य प्रकार की है, तो मैं इसे केवल सर्वर पर अस्वीकार करने के लिए अपलोड बैंडविड्थ को बर्बाद करने के बजाय क्लाइंट साइड पर अस्वीकार कर सकता हूं।
प्रश्न

@ रायनेकोलस, कूल दोस्त! जब मेरे पास समय होगा तब इसके माध्यम से देखूंगा। धन्यवाद :)
प्रश्न १४ '

क्या आप सुनिश्चित हैं कि आपकी परीक्षण फ़ाइल में अभी भी mimetype है image/jpeg, और आपने वास्तव में एक्सटेंशन को बदलकर संशोधित नहीं किया है?
बेर्गी

जवाबों:


343

आप FileReaderसर्वर पर अपलोड करने से पहले जावास्क्रिप्ट के साथ फ़ाइल MIME प्रकार को आसानी से निर्धारित कर सकते हैं । मैं सहमत हूं कि हमें क्लाइंट-साइड पर सर्वर-साइड चेकिंग को प्राथमिकता देनी चाहिए, लेकिन क्लाइंट-साइड चेकिंग अभी भी संभव है। मैं आपको दिखाता हूँ कि कैसे और नीचे एक कार्यशील डेमो प्रदान करता है।


जांचें कि आपका ब्राउज़र दोनों का समर्थन करता है Fileऔर Blob। सभी प्रमुख चाहिए।

if (window.FileReader && window.Blob) {
    // All the File APIs are supported.
} else {
    // File and Blob are not supported
}

चरण 1:

आप इस तरह Fileसे एक <input>तत्व से जानकारी प्राप्त कर सकते हैं ( रेफरी ):

<input type="file" id="your-files" multiple>
<script>
var control = document.getElementById("your-files");
control.addEventListener("change", function(event) {
    // When the control has changed, there are new files
    var files = control.files,
    for (var i = 0; i < files.length; i++) {
        console.log("Filename: " + files[i].name);
        console.log("Type: " + files[i].type);
        console.log("Size: " + files[i].size + " bytes");
    }
}, false);
</script>

यहाँ उपरोक्त ( Ref ) का ड्रैग-एंड-ड्रॉप संस्करण है :

<div id="your-files"></div>
<script>
var target = document.getElementById("your-files");
target.addEventListener("dragover", function(event) {
    event.preventDefault();
}, false);

target.addEventListener("drop", function(event) {
    // Cancel default actions
    event.preventDefault();
    var files = event.dataTransfer.files,
    for (var i = 0; i < files.length; i++) {
        console.log("Filename: " + files[i].name);
        console.log("Type: " + files[i].type);
        console.log("Size: " + files[i].size + " bytes");
    }
}, false);
</script>

चरण 2:

अब हम फाइलों का निरीक्षण कर सकते हैं और हेडर और MIME प्रकारों को छेड़ सकते हैं।

✘ त्वरित विधि

आप भोलेपन से पूछ सकते हैं ब्लॉब जो कुछ फ़ाइल यह इस पद्धति का उपयोग कर का प्रतिनिधित्व करता है के MIME प्रकार के लिए:

var blob = files[i]; // See step 1 above
console.log(blob.type);

छवियों के लिए, MIME प्रकार निम्नलिखित की तरह वापस आते हैं:

छवि / जेपीईजी
छवि / पीएनजी
...

कैविएट: MIME प्रकार को फ़ाइल एक्सटेंशन से पता लगाया जाता है और इसे मूर्ख या स्पूफ किया जा सकता है। कोई एक का नाम बदल सकता .jpgहै .pngऔर MIME प्रकार के रूप में रिपोर्ट किया जाएगा image/png


✓ उचित हेडर-निरीक्षण विधि

एक क्लाइंट-साइड फ़ाइल के बोनाफाइड माइम प्रकार को प्राप्त करने के लिए हम एक कदम आगे जा सकते हैं और तथाकथित जादू संख्याओं के खिलाफ तुलना करने के लिए दिए गए फ़ाइल के पहले कुछ बाइट्स का निरीक्षण कर सकते हैं । चेतावनी दी कि यह पूरी तरह से सीधा नहीं है क्योंकि, उदाहरण के लिए, जेपीईजी में कुछ "मैजिक नंबर" हैं। इसका कारण यह है कि यह प्रारूप 1991 से विकसित हुआ है। आप केवल पहले दो बाइट्स की जाँच कर सकते हैं, लेकिन मैं गलत सकारात्मकता को कम करने के लिए कम से कम 4 बाइट्स की जाँच करना पसंद करता हूँ।

उदाहरण फ़ाइल JPEG (पहले 4 बाइट्स) के हस्ताक्षर:

FF D8 FF E0 (SOI + ADD0)
FF D8 FF E1 (SOI + ADD1)
FF D8 FF E2 (SOI + ADD2)

यहाँ फ़ाइल हेडर को पुनः प्राप्त करने के लिए आवश्यक कोड है:

var blob = files[i]; // See step 1 above
var fileReader = new FileReader();
fileReader.onloadend = function(e) {
  var arr = (new Uint8Array(e.target.result)).subarray(0, 4);
  var header = "";
  for(var i = 0; i < arr.length; i++) {
     header += arr[i].toString(16);
  }
  console.log(header);

  // Check the file signature against known types

};
fileReader.readAsArrayBuffer(blob);

फिर आप वास्तविक MIME प्रकार को निर्धारित कर सकते हैं (अधिक फ़ाइल हस्ताक्षर यहाँ और यहाँ ):

switch (header) {
    case "89504e47":
        type = "image/png";
        break;
    case "47494638":
        type = "image/gif";
        break;
    case "ffd8ffe0":
    case "ffd8ffe1":
    case "ffd8ffe2":
    case "ffd8ffe3":
    case "ffd8ffe8":
        type = "image/jpeg";
        break;
    default:
        type = "unknown"; // Or you can use the blob.type as fallback
        break;
}

अपेक्षित रूप से MIME प्रकारों के आधार पर फ़ाइल अपलोड स्वीकार या अस्वीकार करें।


डेमो

यहां स्थानीय फ़ाइलों और दूरस्थ फ़ाइलों के लिए एक कार्यशील डेमो है (मुझे इस डेमो के लिए केवल कॉर्स को बायपास करना था)। स्निपेट खोलें, इसे चलाएं, और आपको विभिन्न प्रकार के तीन दूरस्थ चित्र प्रदर्शित होने चाहिए। शीर्ष पर आप एक स्थानीय छवि या डेटा फ़ाइल का चयन कर सकते हैं , और फ़ाइल हस्ताक्षर और / या MIME प्रकार प्रदर्शित किया जाएगा।

ध्यान दें कि एक छवि का नाम बदलने पर भी, इसका वास्तविक MIME प्रकार निर्धारित किया जा सकता है। निचे देखो।

स्क्रीनशॉट

डेमो का अपेक्षित आउटपुट



8
2 छोटी टिप्पणियाँ। (१) फ़ाइल को पहले पढ़ने के लिए पहले ४ बाइट्स में स्लाइस करना बेहतर नहीं होगा? fileReader.readAsArrayBuffer(blob.slice(0,4))? (२) फ़ाइल हस्ताक्षरों को कॉपी / पेस्ट करने के लिए, हेडर का निर्माण ० के अग्रणी के साथ नहीं होना चाहिए for(var i = 0; i < bytes.length; i++) { var byte = bytes[i]; fileSignature += (byte < 10 ? "0" : "") + byte.toString(16); }?
मैथ्यू मैडसन

1
देखें @Deadpool यहाँ । विभिन्न निर्माताओं से अधिक, कम सामान्य, जेपीईजी प्रारूप हैं। उदाहरण के लिए, FF D8 FF E2= CANNON EOS JPEG FILE, FF D8 FF E3= SAMSUNG D500 JPEG FILE। JPEG हस्ताक्षर का मुख्य भाग केवल 2 बाइट्स है, लेकिन झूठी सकारात्मकता को कम करने के लिए मैंने सबसे आम 4-बाइट हस्ताक्षर जोड़े। मुझे आशा है कि वह मदद करेंगे।
Drakes

23
इस जवाब की गुणवत्ता सिर्फ आश्चर्यजनक है।
लुका

2
MimeType निर्धारित करने के लिए आपको ArrayBuffer के रूप में पूर्ण blob लोड करने की आवश्यकता नहीं है। आप सिर्फ स्लाइस कर सकते हैं और इस तरह बूँद के पहले 4 बाइट पास कर सकते हैं:fileReader.readAsArrayBuffer(blob.slice(0, 4))
codeVerine

2
केवल सादे पाठ की अनुमति देने के लिए चेक क्या होना चाहिए? पाठ फ़ाइलों के लिए पहले 4 बाइट्स पाठ फ़ाइल में पहले 4 वर्णों के लिए प्रतीत होते हैं।
MP Droid

19

जैसा कि अन्य उत्तरों में कहा गया है, आप फ़ाइल के पहले बाइट्स में फ़ाइल के हस्ताक्षर की जांच करके माइम प्रकार की जांच कर सकते हैं ।

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

/**
 * Load the mime type based on the signature of the first bytes of the file
 * @param  {File}   file        A instance of File
 * @param  {Function} callback  Callback with the result
 * @author Victor www.vitim.us
 * @date   2017-03-23
 */
function loadMime(file, callback) {
    
    //List of known mimes
    var mimes = [
        {
            mime: 'image/jpeg',
            pattern: [0xFF, 0xD8, 0xFF],
            mask: [0xFF, 0xFF, 0xFF],
        },
        {
            mime: 'image/png',
            pattern: [0x89, 0x50, 0x4E, 0x47],
            mask: [0xFF, 0xFF, 0xFF, 0xFF],
        }
        // you can expand this list @see https://mimesniff.spec.whatwg.org/#matching-an-image-type-pattern
    ];

    function check(bytes, mime) {
        for (var i = 0, l = mime.mask.length; i < l; ++i) {
            if ((bytes[i] & mime.mask[i]) - mime.pattern[i] !== 0) {
                return false;
            }
        }
        return true;
    }

    var blob = file.slice(0, 4); //read the first 4 bytes of the file

    var reader = new FileReader();
    reader.onloadend = function(e) {
        if (e.target.readyState === FileReader.DONE) {
            var bytes = new Uint8Array(e.target.result);

            for (var i=0, l = mimes.length; i<l; ++i) {
                if (check(bytes, mimes[i])) return callback("Mime: " + mimes[i].mime + " <br> Browser:" + file.type);
            }

            return callback("Mime: unknown <br> Browser:" + file.type);
        }
    };
    reader.readAsArrayBuffer(blob);
}


//when selecting a file on the input
fileInput.onchange = function() {
    loadMime(fileInput.files[0], function(mime) {

        //print the output to the screen
        output.innerHTML = mime;
    });
};
<input type="file" id="fileInput">
<div id="output"></div>


मुझे लगता है कि इवेंट हैंडलर ( W3C स्पेक ) में readyStateहमेशा रहेगा भले ही कोई त्रुटि हो - क्या इसके बजाय चेक नहीं होना चाहिए ? FileReader.DONE(!e.target.error)
ब्वॉयज

5

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

https://github.com/sindresorhus/file-type

आप इस उपयोगिता का उपयोग करके मेमोरी में सब कुछ लोड करने से बचने के लिए पहले एक्स बाइट्स में केवल पढ़ने के Vitim.us के सुझाव को जोड़ सकते हैं:

import fileType from 'file-type'; // or wherever you load the dependency

const blob = file.slice(0, fileType.minimumBytes);

const reader = new FileReader();
reader.onloadend = function(e) {
  if (e.target.readyState !== FileReader.DONE) {
    return;
  }

  const bytes = new Uint8Array(e.target.result);
  const { ext, mime } = fileType.fromBuffer(bytes);

  // ext is the desired extension and mime is the mimetype
};
reader.readAsArrayBuffer(blob);

मेरे लिए, पुस्तकालय के नवीनतम संस्करण को काम नहीं किया था, लेकिन "file-type": "12.4.0"काम किया है और मैं का इस्तेमाल किया थाimport * as fileType from "file-type";
ssz

4

यदि आप बस यह जांचना चाहते हैं कि क्या अपलोड की गई फ़ाइल एक छवि है तो आप इसे <img>किसी भी त्रुटि कॉलबैक के लिए एक चेक टैग में लोड करने का प्रयास कर सकते हैं ।

उदाहरण:

var input = document.getElementsByTagName('input')[0];
var reader = new FileReader();

reader.onload = function (e) {
    imageExists(e.target.result, function(exists){
        if (exists) {

            // Do something with the image file.. 

        } else {

            // different file format

        }
    });
};

reader.readAsDataURL(input.files[0]);


function imageExists(url, callback) {
    var img = new Image();
    img.onload = function() { callback(true); };
    img.onerror = function() { callback(false); };
    img.src = url;
}

1
महान काम करता है, मैं एक .gif फ़ाइल अपलोडर हैक की कोशिश की और यह एक त्रुटि फेंक दिया :)
pathfinder

4

यही आपको करना है

var fileVariable =document.getElementsById('fileId').files[0];

यदि आप छवि फ़ाइल प्रकारों की जांच करना चाहते हैं तो

if(fileVariable.type.match('image.*'))
{
 alert('its an image');
}

वर्तमान में इसके लिए काम नहीं कर रहा है: एंड्रॉइड के लिए फ़ायरफ़ॉक्स, एंड्रॉइड के लिए ओपेरा और आईओएस पर सफारी। developer.mozilla.org/en-US/docs/Web/API/File/type
रीड

3

यहाँ एक टाइपस्क्रिप्ट कार्यान्वयन है जो वेबप का समर्थन करता है। यह Vitim.us द्वारा जावास्क्रिप्ट जवाब पर आधारित है।

interface Mime {
  mime: string;
  pattern: (number | undefined)[];
}

// tslint:disable number-literal-format
// tslint:disable no-magic-numbers
const imageMimes: Mime[] = [
  {
    mime: 'image/png',
    pattern: [0x89, 0x50, 0x4e, 0x47]
  },
  {
    mime: 'image/jpeg',
    pattern: [0xff, 0xd8, 0xff]
  },
  {
    mime: 'image/gif',
    pattern: [0x47, 0x49, 0x46, 0x38]
  },
  {
    mime: 'image/webp',
    pattern: [0x52, 0x49, 0x46, 0x46, undefined, undefined, undefined, undefined, 0x57, 0x45, 0x42, 0x50, 0x56, 0x50],
  }
  // You can expand this list @see https://mimesniff.spec.whatwg.org/#matching-an-image-type-pattern
];
// tslint:enable no-magic-numbers
// tslint:enable number-literal-format

function isMime(bytes: Uint8Array, mime: Mime): boolean {
  return mime.pattern.every((p, i) => !p || bytes[i] === p);
}

function validateImageMimeType(file: File, callback: (b: boolean) => void) {
  const numBytesNeeded = Math.max(...imageMimes.map(m => m.pattern.length));
  const blob = file.slice(0, numBytesNeeded); // Read the needed bytes of the file

  const fileReader = new FileReader();

  fileReader.onloadend = e => {
    if (!e || !fileReader.result) return;

    const bytes = new Uint8Array(fileReader.result as ArrayBuffer);

    const valid = imageMimes.some(mime => isMime(bytes, mime));

    callback(valid);
  };

  fileReader.readAsArrayBuffer(blob);
}

// When selecting a file on the input
fileInput.onchange = () => {
  const file = fileInput.files && fileInput.files[0];
  if (!file) return;

  validateImageMimeType(file, valid => {
    if (!valid) {
      alert('Not a valid image file.');
    }
  });
};

<input type="file" id="fileInput">


1

जैसा कि ड्रेक ने कहा है कि यह FileReader के साथ किया जा सकता है। हालाँकि, जो मैं यहाँ प्रस्तुत करता हूँ वह एक कार्यात्मक संस्करण है। ध्यान रखें कि जावास्क्रिप्ट के साथ ऐसा करने में बड़ी समस्या इनपुट फ़ाइल को रीसेट करना है। खैर, यह केवल JPG के लिए प्रतिबंधित है (अन्य प्रारूपों के लिए आपको इसे बदलना होगा माइम प्रकार और मैजिक नंबर ):

<form id="form-id">
  <input type="file" id="input-id" accept="image/jpeg"/>
</form>

<script type="text/javascript">
    $(function(){
        $("#input-id").on('change', function(event) {
            var file = event.target.files[0];
            if(file.size>=2*1024*1024) {
                alert("JPG images of maximum 2MB");
                $("#form-id").get(0).reset(); //the tricky part is to "empty" the input file here I reset the form.
                return;
            }

            if(!file.type.match('image/jp.*')) {
                alert("only JPG images");
                $("#form-id").get(0).reset(); //the tricky part is to "empty" the input file here I reset the form.
                return;
            }

            var fileReader = new FileReader();
            fileReader.onload = function(e) {
                var int32View = new Uint8Array(e.target.result);
                //verify the magic number
                // for JPG is 0xFF 0xD8 0xFF 0xE0 (see https://en.wikipedia.org/wiki/List_of_file_signatures)
                if(int32View.length>4 && int32View[0]==0xFF && int32View[1]==0xD8 && int32View[2]==0xFF && int32View[3]==0xE0) {
                    alert("ok!");
                } else {
                    alert("only valid JPG images");
                    $("#form-id").get(0).reset(); //the tricky part is to "empty" the input file here I reset the form.
                    return;
                }
            };
            fileReader.readAsArrayBuffer(file);
        });
    });
</script>

ध्यान रखें कि यह फ़ायरफ़ॉक्स और क्रोम के नवीनतम संस्करणों और IExplore 10 पर परीक्षण किया गया था।

माइम प्रकारों की पूरी सूची के लिए देखें विकिपीडिया

मैजिक नंबर की पूरी सूची के लिए देखें विकिपीडिया


ऊपर दिए गए विकिपीडिया लिंक अब मान्य नहीं हैं।
बॉब क्विन

@ थैंक्यू तय,
थैंक्स

0

यहाँ रॉबर्टो 14 के उत्तर का विस्तार दिया गया है जो निम्नलिखित है:

यह केवल सभी चित्रों को पूरा करेगा

अगर FileReader उपलब्ध है और यह उपलब्ध नहीं है, तो चेक एक्सटेंशन में वापस गिर जाता है।

एक छवि नहीं तो एक त्रुटि चेतावनी देता है

यदि यह एक छवि है तो यह एक पूर्वावलोकन लोड करता है

** आपको अभी भी सर्वर साइड सत्यापन करना चाहिए, यह अंत उपयोगकर्ता के लिए कुछ और की तुलना में अधिक सुविधा है। लेकिन यह आसान है!

<form id="myform">
    <input type="file" id="myimage" onchange="readURL(this)" />
    <img id="preview" src="#" alt="Image Preview" />
</form>

<script>
function readURL(input) {
    if (window.FileReader && window.Blob) {
        if (input.files && input.files[0]) {
            var reader = new FileReader();
            reader.onload = function (e) {
                var img = new Image();
                img.onload = function() {
                    var preview = document.getElementById('preview');
                    preview.src = e.target.result;
                    };
                img.onerror = function() { 
                    alert('error');
                    input.value = '';
                    };
                img.src = e.target.result;
                }
            reader.readAsDataURL(input.files[0]);
            }
        }
    else {
        var ext = input.value.split('.');
        ext = ext[ext.length-1].toLowerCase();      
        var arrayExtensions = ['jpg' , 'jpeg', 'png', 'bmp', 'gif'];
        if (arrayExtensions.lastIndexOf(ext) == -1) {
            alert('error');
            input.value = '';
            }
        else {
            var preview = document.getElementById('preview');
            preview.setAttribute('alt', 'Browser does not support preview.');
            }
        }
    }
</script>

-1

लघु उत्तर नहीं है।

जैसा कि आप ध्यान दें कि ब्राउज़र typeफ़ाइल एक्सटेंशन से निकले हैं । मैक पूर्वावलोकन एक्सटेंशन को चलाने के लिए भी लगता है। मैं इसका अनुमान लगा रहा हूं क्योंकि इसका तेजी से सूचक में निहित फ़ाइल नाम को पढ़ने, डिस्क पर फ़ाइल को देखने और पढ़ने के बजाय।

मैंने png के साथ नाम बदलकर बनाये गए एक कॉपी की।

मैं क्रोम में दोनों छवियों से लगातार प्राप्त करने में सक्षम था (आधुनिक ब्राउज़रों में काम करना चाहिए)।

ÿØÿàJFIFÿþ;CREATOR: gd-jpeg v1.0 (using IJG JPEG v62), quality = 90

जिसे आप इमेज टाइप के लिए String.indexOf ('jpeg') चेक से हैक कर सकते हैं।

यहाँ http://jsfiddle.net/bamb/jkZ2v/1/ का पता लगाने के लिए एक पहेली है

अस्पष्ट लाइन मैं उदाहरण में टिप्पणी करना भूल गया

console.log( /^(.*)$/m.exec(window.atob( image.src.split(',')[1] )) );

  • छवि पर छोड़ते हुए, बेस 64 एनकोडेड ईएमजी डेटा को विभाजित करता है
  • Base64 छवि को डीकोड करता है
  • छवि डेटा की केवल पहली पंक्ति से मेल खाता है

फिडेल कोड बेस 64 डिकोड का उपयोग करता है जो IE9 में काम नहीं करता है, मुझे वीबी स्क्रिप्ट का उपयोग करके एक अच्छा उदाहरण मिला है जो IE में काम करता है http://blog.nihilogic.dk/2008/08/imageinfo-reading-image-metalata-with.html

छवि को लोड करने के लिए कोड जोएल वर्डी से लिया गया था, जो अपलोड करने से पहले ग्राहक की ओर से कुछ शांत छवि के कैनवास का उपयोग कर रहा है, जो कि ब्याज की हो सकती है https://joelvardy.com/writing/javascript-image-upload


1
कृपया JPEGs को "jpeg" विकल्प के लिए न खोजें, यह सिर्फ एक संयोग है जो आपको एक टिप्पणी में मिला। JPEG फ़ाइलों को इसमें सम्‍मिलित नहीं करना है (और यदि आप JFIFइसके बजाय खोज करने के बारे में सोच रहे हैं , APP0तो JIFIF को EXIF-JPEGs में सम्‍मिलित करने की आवश्‍यकता नहीं है)।
कोर्नेल

शीर्ष देखें "लघु उत्तर नहीं है"।
लेक्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.