আপলোডের আগে জাভাস্ক্রিপ্ট সহ ফাইল এমআইএমআই টাইপ কীভাবে চেক করবেন?


177

আমি এটি এবং এই প্রশ্নগুলি পড়েছি যা দেখে মনে হয় যে ক্লায়েন্টের পাশে জাভাস্ক্রিপ্ট ব্যবহার করে মাইম টাইপ ফাইলটি চেক করা যেতে পারে। এখন, আমি বুঝতে পারি যে সত্যিকারের বৈধতা এখনও সার্ভারের পাশেই করা উচিত। আমি সার্ভার সংস্থান অপ্রয়োজনীয় অপচয় এড়াতে একটি ক্লায়েন্ট পক্ষ পরীক্ষা করতে চাই।

এটি ক্লায়েন্টের পক্ষেই করা যায় কিনা তা পরীক্ষা করতে, আমি একটি JPEGপরীক্ষার ফাইলের এক্সটেনশন পরিবর্তন করেছি .pngএবং ফাইলটি আপলোডের জন্য বেছে নিয়েছি । ফাইলটি প্রেরণের আগে, আমি জাভাস্ক্রিপ্ট কনসোলটি ব্যবহার করে ফাইলটির বিষয়টিকে জিজ্ঞাসা করছি:

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

এটি আমি ক্রোমে ২৮.০ এ পেয়েছি:

ফাইল {ওয়েবকিট রিলেটিভপথ: "", সর্বশেষমাফিক্যৃত তারিখ: মঙ্গলবার অক্টোবর 16 2012 10:00:00 জিএমটি +0000 (ইউটিসি), নাম: "test.png", টাইপ: "চিত্র / পিএনজি", আকার: 500055…}

এটি প্রকারভেদ দেখায় image/pngযা দেখে মনে হয় যে এমআইএম টাইপের পরিবর্তে ফাইল এক্সটেনশনের ভিত্তিতে চেকিং সম্পন্ন হয়েছে। আমি ফায়ারফক্স ২২.০ চেষ্টা করেছি এবং এটি আমাকে একই ফলাফল দেয়। কিন্তু অনুযায়ী W3C এর বৈশিষ্ট , এমআইএমই চোদা বাস্তবায়িত করতে হবে।

আমি কি এই কথাটি ঠিক বলতে পারি যে এই মুহূর্তে জাভাস্ক্রিপ্টের সাথে এমআইএমআই টাইপ চেক করার কোনও উপায় নেই? নাকি আমি কিছু মিস করছি?


5
I want to perform a client side checking to avoid unnecessary wastage of server resource.আপনি কীভাবে বলছেন যে সার্ভারের পাশ দিয়ে বৈধতা অর্জন করতে হবে তা আমি বুঝতে পারি না, তবে তারপরে আপনি বলে যে আপনি সার্ভারের সংস্থানগুলি হ্রাস করতে চান। সুবর্ণ নিয়ম: কখনই ব্যবহারকারীর ইনপুটকে বিশ্বাস করবেন না । ক্লায়েন্ট সাইডে মাইম টাইপ যাচাই করার বিষয়টি যদি আপনি কেবল সার্ভারের পাশে এটি করে থাকেন। অবশ্যই এটি একটি " ক্লায়েন্ট সংস্থান অপ্রয়োজনীয় অপচয় "?
ইয়ান ক্লার্ক

7
ব্যবহারকারীদের ক্লায়েন্ট-সাইডে আরও ভাল ফাইল টাইপ চেকিং / প্রতিক্রিয়া সরবরাহ করা ভাল ধারণা। তবে, যেমন আপনি বলেছেন, ব্রাউজারগুলি কেবলমাত্র বস্তুর typeজন্য সম্পত্তিটির মূল্য নির্ধারণ করার সময় ফাইল এক্সটেনশনের উপর নির্ভর করে File। ওয়েবকিট উত্স কোড, উদাহরণস্বরূপ, এই সত্যটি প্রকাশ করে। অন্যান্য জিনিসগুলির মধ্যে ফাইলগুলিতে "ম্যাজিক বাইটস" সন্ধান করে ফাইলগুলি ক্লায়েন্ট-সাইডটি সঠিকভাবে সনাক্ত করা সম্ভব। আমি বর্তমানে একটি এমআইটি লাইব্রেরিতে কাজ করছি (আমার অল্প ফ্রি সময় কী আছে) যা তা করবে। আপনি যদি আমার অগ্রগতিতে আগ্রহী হন, github.com/rnicholus/determinater দেখুন
রে নিকোলাস

32
@ ইয়ানক্লার্ক, মুল বক্তব্যটি হ'ল যদি ফাইলটি কোনও অবৈধ ধরণের হয় তবে আমি এটি ক্লায়েন্টের পক্ষ থেকে কেবলমাত্র সার্ভারের দিক থেকে এটি প্রত্যাখ্যান করার জন্য আপলোড ব্যান্ডউইথকে নষ্ট করার চেয়ে বাতিল করতে পারি।
প্রশ্ন ওভারফ্লো

@ রায়নিচলাস, শান্ত দোস্ত! আমার কাছে সময় পেলেই তা দেখতে পাবে। ধন্যবাদ :)
প্রশ্ন ওভারফ্লো

আপনি কি নিশ্চিত যে আপনার পরীক্ষার ফাইলটিতে এখনও মাইমটাইপ রয়েছে image/jpegএবং আপনি আসলে এটি এক্সটেনশন পরিবর্তন করে সংশোধন করেননি?
বার্গি

উত্তর:


343

FileReaderসার্ভারে আপলোড করার আগে আপনি জাভাস্ক্রিপ্টের সাথে এমআইএমআই টাইপটি সহজেই নির্ধারণ করতে পারেন । আমি একমত যে আমাদের ক্লায়েন্ট-সাইডের চেয়ে সার্ভার-সাইড চেক করা উচিত, তবে ক্লায়েন্ট-সাইড চেকিং এখনও সম্ভব। আমি আপনাকে দেখাব যে নীচে এবং কীভাবে একটি ওয়ার্কিং ডেমো সরবরাহ করব।


আপনার ব্রাউজার 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>

এখানে উপরের ( রেফ ) এর একটি ড্রাগন এবং ড্রপ সংস্করণ :

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

ধাপ ২:

আমরা এখন ফাইলগুলি পরীক্ষা করতে পারি এবং শিরোনাম এবং এমআইএমএম প্রকারগুলি টিজ করতে পারি।

✘ দ্রুত পদ্ধতি

আপনি naively অনুরোধ করতে পারেন ব্লব যাই হোক না কেন ফাইল এটা এই প্যাটার্ন ব্যবহার প্রতিনিধিত্ব করে MIME প্রকার জন্য:

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

চিত্রগুলির জন্য, মাইম টাইমগুলি নিম্নলিখিতগুলির মতো ফিরে আসে:

চিত্র / জেপিইগ
ইমেজ / পিএনজি
...

ক্যাভেট: মাইম টাইপটি ফাইল এক্সটেনশান থেকে সনাক্ত করা হয়েছে এবং বোকা বা স্পোফ করা যেতে পারে। যে কোনও একটিতে একটি নাম পরিবর্তন করতে .jpgপারে .pngএবং মাইমে টাইপ হিসাবে রিপোর্ট করা হবে image/png


✓ সঠিক শিরোনাম-পরিদর্শন পদ্ধতি

ক্লায়েন্ট-সাইড ফাইলের বোনফাইড এমআইএমআই টাইপ পাওয়ার জন্য আমরা তথাকথিত যাদু সংখ্যার সাথে তুলনা করার জন্য প্রদত্ত ফাইলটির প্রথম কয়েকটি বাইট পরিদর্শন করতে পারি । সতর্ক হোন যে এটি সম্পূর্ণ সোজা নয়, উদাহরণস্বরূপ, জেপিগের কয়েকটি "ম্যাজিক সংখ্যা" রয়েছে। এটি কারণ যে ফর্ম্যাটটি 1991 সাল থেকে বিকশিত হয়েছে You আপনি কেবলমাত্র প্রথম দুটি বাইট চেক করেই পালিয়ে যেতে পারেন তবে আমি মিথ্যা ইতিবাচক হ্রাস করতে কমপক্ষে 4 বাইট পরীক্ষা করা পছন্দ করি।

জেপিজির ফাইল স্বাক্ষরের উদাহরণ (প্রথম 4 বাইট):

এফএফ ডি 8 এফএফ E0 (এসওআই + এডিডি 0)
এফএফ ডি 8 এফএফ ই 1 (এসওআই + এডিডি 1)
এফএফ ডি 8 এফএফ ই 2 (এসওআই + এডিডি 2)

ফাইল শিরোনাম পুনরুদ্ধার করার জন্য এখানে প্রয়োজনীয় কোডটি রয়েছে:

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

তারপরে আপনি আসল এমআইএমএম টাইপটি ঠিক তেমনভাবে নির্ধারণ করতে পারেন (আরও ফাইলের স্বাক্ষর এখানে এবং এখানে ):

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

প্রত্যাশিত মাইমে টাইপের ভিত্তিতে আপনার পছন্দ মতো ফাইল আপলোডগুলি গ্রহণ বা প্রত্যাখ্যান করুন।


ডেমো

স্থানীয় ফাইল এবং রিমোট ফাইলগুলির জন্য এখানে একটি কার্যকারী ডেমো রয়েছে (আমাকে কেবল এই ডেমোটির জন্য CORS বাইপাস করতে হয়েছিল)। স্নিপেট খুলুন, এটি চালান, এবং আপনার প্রদর্শিত বিভিন্ন ধরণের তিনটি দূরবর্তী চিত্র দেখতে হবে। শীর্ষে আপনি একটি স্থানীয় চিত্র বা ডেটা ফাইল নির্বাচন করতে পারেন , এবং ফাইল স্বাক্ষর এবং / অথবা MIME টাইপ প্রদর্শিত হবে।

লক্ষ্য করুন যে কোনও চিত্রের নতুন নামকরণ করা হলেও, তার সত্যিকারের MIME টাইপ নির্ধারণ করা যেতে পারে। নিচে দেখ.

স্ক্রিনশট

ডেমোর প্রত্যাশিত আউটপুট



8
2 টি ছোট মন্তব্য। (1) পড়ার আগে ফাইলটি প্রথম 4 বাইটে টুকরো টুকরো করা ভাল না? fileReader.readAsArrayBuffer(blob.slice(0,4))? (২) ফাইলের স্বাক্ষরগুলি অনুলিপি / আটকানোর জন্য, শিরোনামটি 0 টি শীর্ষস্থানীয় দিয়ে তৈরি করা উচিত নয় for(var i = 0; i < bytes.length; i++) { var byte = bytes[i]; fileSignature += (byte < 10 ? "0" : "") + byte.toString(16); }?
ম্যাথু ম্যাডসন

1
@ ডেডপুল এখানে দেখুন । বিভিন্ন নির্মাতাদের আরও, কম সাধারণ, জেপিজি ফর্ম্যাট রয়েছে। উদাহরণস্বরূপ, FF D8 FF E2= ক্যানন ইওএস জেপিগ ফাইল, FF D8 FF E3= স্যামসং ডি 500 জেপিইগ ফাইল। জেপিজি স্বাক্ষরের মূল অংশটি মাত্র 2 বাইট, তবে মিথ্যা ইতিবাচক হ্রাস করতে আমি সর্বাধিক সাধারণ 4-বাইট স্বাক্ষর যুক্ত করেছি। আমি আশা করি এটি সাহায্য করবে.
ছকড়া

23
এই উত্তরের গুণটি কেবল আশ্চর্যজনক।
লুকা

2
মাইমটাইপ নির্ধারণ করতে আপনাকে অ্যারেবফার হিসাবে সম্পূর্ণ ব্লব লোড করতে হবে না। আপনি শুধু ফালি করতে পারেন এবং প্রথম ফোঁটা এর 4 বাইট ভালো পাস:fileReader.readAsArrayBuffer(blob.slice(0, 4))
codeVerine

2
কেবল সরল পাঠ্যকে অনুমতি দেওয়ার জন্য চেকটি কী হওয়া উচিত? পাঠ্য ফাইলগুলির জন্য প্রথম 4 বাইটগুলি টেক্সট ফাইলের প্রথম 4 টি অক্ষর বলে মনে হয়।
এমপি ড্রয়েড

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>


আমি মনে করি যে কোনও ত্রুটি থাকলেও ইভেন্ট হ্যান্ডলার ( ডাব্লু 3 সি স্পেস ) readyStateসর্বদা থাকবে - পরিবর্তে যদি চেকটি করা উচিত না ? FileReader.DONE(!e.target.error)
বালক

5

যে কেউ নিজেরাই এটিকে বাস্তবায়ন করতে চাইছে না তাদের জন্য, সিন্ডারসোরাস একটি ইউটিলিটি তৈরি করেছেন যা ব্রাউজারে কাজ করে এবং বেশিরভাগ নথির জন্য আপনি চাইলে শিরোনাম থেকে মাইম ম্যাপিং করতে পারেন।

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

এই ইউটিলিটিটি ব্যবহার করে স্মৃতিতে সমস্ত কিছু লোড করা এড়াতে আপনি প্রথম এক্স বাইটে কেবলমাত্র পড়ার ভিটিম.ইস এর পরামর্শটি একত্রিত করতে পারেন (উদাহরণে এসএস 6):

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";
এসএসজেড

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 ফাইল আপলোডার হ্যাক চেষ্টা করেছিলাম এবং এটি একটি ত্রুটি ছুঁড়ে ফেলেছে :)
পাথফাইন্ডার

4

এটিই আপনাকে করতে হবে

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

আপনি যদি চিত্র ফাইলের প্রকারগুলি পরীক্ষা করতে চান তবে

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

বর্তমানে এর জন্য কাজ করছে না: অ্যান্ড্রয়েডের জন্য ফায়ারফক্স, অ্যান্ড্রয়েডের জন্য অপেরা এবং আইওএসে সাফারি। বিকাশকারী.মোজিলা.আর.ইন-
রিড

3

এখানে একটি টাইপস্ক্রিপ্ট বাস্তবায়ন যা ওয়েবপিকে সমর্থন করে। এটি ভিটিম.ইউসের জাভাস্ক্রিপ্ট উত্তরের উপর ভিত্তি করে।

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

ড্রাকের বিবরণ অনুসারে এটি ফাইলরেডার দিয়ে করা যেতে পারে। তবে, আমি এখানে যা উপস্থাপন করছি তা একটি কার্যকরী সংস্করণ। বিবেচনা করে নিন যে জাভাস্ক্রিপ্টের সাহায্যে এটি করার ক্ষেত্রে বড় সমস্যা হ'ল ইনপুট ফাইলটি পুনরায় সেট করা। ভাল, এটি কেবল জেপিজিতে সীমাবদ্ধ করে (অন্যান্য ফর্ম্যাটগুলির জন্য আপনাকে মাইম টাইপ এবং ম্যাজিক নম্বরটি পরিবর্তন করতে হবে ):

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

বিবেচনা করে দেখুন যে এটি ফায়ারফক্স এবং ক্রোমের সর্বশেষ সংস্করণে এবং আইপিসপ্লোরার 10 এ পরীক্ষা করা হয়েছিল।

মাইম ধরণের সম্পূর্ণ তালিকার জন্য উইকিপিডিয়া দেখুন

যাদু সংখ্যার সম্পূর্ণ তালিকার জন্য উইকিপিডিয়া দেখুন


উপরের উইকিপিডিয়া লিঙ্কগুলি আর বৈধ নয়।
বব কুইন

@ BobQuinn স্থির, থানস্ক
lmiguelmh

0

রবার্তো 14 এর উত্তরের এখানে একটি এক্সটেনশান দেওয়া হয়েছে যা নিম্নলিখিতগুলি করে:

এটি কেবলমাত্র চিত্রগুলিই দেবে

ফাইলআরডার পাওয়া যায় কিনা তা পরীক্ষা করে এবং যদি এটি উপলব্ধ না হয় তবে পুনরায় এক্সটেনশন চেক করতে যায়।

কোনও চিত্র না হলে একটি ত্রুটি সতর্কতা দেয়

এটি যদি একটি চিত্র হয় তবে এটি পূর্বরূপ লোড করে

** আপনার এখনও সার্ভার সাইড বৈধকরণ করা উচিত, এটি অন্য কোনও কিছুর চেয়ে শেষ ব্যবহারকারীর পক্ষে আরও সুবিধা। তবে হাতের কাজ!

<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ফাইল এক্সটেনশন থেকে প্রাপ্ত হিসাবে নোট করুন । ম্যাক প্রাকদর্শনটিও এক্সটেনশনটি শেষ বলে মনে হচ্ছে। আমি এটি ধরে নিচ্ছি কারণ ডিস্কে ফাইলটি সন্ধান করা এবং পড়ার চেয়ে পয়েন্টারে থাকা ফাইলের নামটি দ্রুত পড়া reading

আমি পিএনজি দিয়ে নামকরণ করা একটি জেপিজির একটি অনুলিপি তৈরি করেছি।

ক্রোম (আধুনিক ব্রাউজারগুলিতে কাজ করা উচিত) দুটি চিত্র থেকে আমি ধারাবাহিকভাবে নিম্নলিখিতটি পেতে সক্ষম হয়েছি।

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

যা আপনি স্ট্রিং.ইন্ডেক্সঅফ ('জেপেইগ') চিত্রের ধরণের জন্য চেক করতে পারেন।

এখানে http://jsfiddle.net/bamboo/jkZ2v/1/ অন্বেষণ করার জন্য একটি মজার

উদ্বেগজনক লাইন আমি উদাহরণে মন্তব্য করতে ভুলে গেছি

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

  • ইমেজ ছেড়ে, বেস 64 এনকোডড img ডেটা বিভক্ত করে
  • বেস 64 ইমেজটি ডিকোড করে
  • চিত্রের তথ্যের প্রথম লাইনের সাথে মেলে

ফিডল কোডটি বেস 64৪ ডিকোডটি ব্যবহার করে যা আইআই ৯ তে কাজ করবে না, আমি ভিবি স্ক্রিপ্ট ব্যবহার করে একটি দুর্দান্ত উদাহরণ পেয়েছি যা আইইতে কাজ করে http://blog.nihilogic.dk/2008/08/imageinfo-reading-image-metadata-with.html

চিত্রটি লোড করার কোডটি জোয়েল ভার্দির কাছ থেকে নেওয়া হয়েছিল, যিনি আপলোড করার আগে ক্লায়েন্টের আকারের কানাভাসকে পুনরায় আকার দিচ্ছেন যা আগ্রহী হতে পারে https://joelvardy.com/writing/javascript-image-upload


1
"Jpeg" সাবস্ট্রিংয়ের জন্য দয়া করে JPEGs সন্ধান করবেন না, এটি একটি কাকতালীয় ঘটনা যা আপনি একটি মন্তব্যে খুঁজে পেয়েছেন। জেপিজি ফাইলগুলিতে এটি ধারণ করতে হবে না (এবং আপনি যদি এর JFIFপরিবর্তে অনুসন্ধানের কথা ভাবছেন তবে ভালভাবে APP0এক্সএফআইপি-জেপিগগুলিতে জেএফআইএফ রাখার দরকার নেই যাতে এটি খুব বেশি হয়)।
কর্নেল

শীর্ষ "দেখুন সংক্ষিপ্ত উত্তর হয় না"।
লেক্স
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.