মাইম ধরণের কোনও আপলোড করা ফাইল ব্রাউজার দ্বারা নির্ধারিত হয়?


87

আমার একটি ওয়েব অ্যাপ্লিকেশন রয়েছে যেখানে ব্যবহারকারীর একটি .zip ফাইল আপলোড করতে হবে। সার্ভার সাইড, আমি আপলোড হওয়া ফাইলের MIME প্রকার চেক করছি, এটা নিশ্চিত করতে application/x-zip-compressedবা application/zip

এটি ফায়ারফক্স এবং আইইয়ের জন্য আমার পক্ষে দুর্দান্ত কাজ করেছে। তবে, যখন কোনও সহকর্মী এটি পরীক্ষা করেছিলেন, এটি ফায়ারফক্সে তার জন্য ব্যর্থ হয়েছিল (প্রেরিত মাইম টাইপটি " application/octet-stream" এর মতো কিছু ছিল ) তবে ইন্টারনেট এক্সপ্লোরারে কাজ করেছিল। আমাদের সেটআপগুলি অভিন্ন বলে মনে হচ্ছে: আইই 8, এফএফ 3.5.1 সমস্ত অ্যাড-অন অক্ষম সহ, উইন এক্সপি এসপি 3, উইনআরআর দেশীয় .zip ফাইল হ্যান্ডলার হিসাবে ইনস্টল হয়েছে (নিশ্চিত না যে এটি প্রাসঙ্গিক কিনা)।

সুতরাং আমার প্রশ্ন: ব্রাউজার কীভাবে মাইম প্রেরণ করবে তা নির্ধারণ করে?

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


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

হ্যাঁ, এটি উভয় ব্রাউজারেই আমার পক্ষে কাজ করেছে
কিপ

দেখুন input/@formenctypeবা form/@enctypeবৈশিষ্ট্যগুলি দেখুন
tuxSlayer

উত্তর:


72

ক্রোম

ক্রোমের (লেখার মতো সংস্করণ 38) মাইম টাইপ নির্ধারণ করার 3 টি উপায় রয়েছে এবং একটি নির্দিষ্ট ক্রমে তা করে। নীচে স্নিপেট ফাইল src/net/base/mime_util.cc, পদ্ধতি থেকে MimeUtil::GetMimeTypeFromExtensionHelper

// We implement the same algorithm as Mozilla for mapping a file extension to
// a mime type.  That is, we first check a hard-coded list (that cannot be
// overridden), and then if not found there, we defer to the system registry.
// Finally, we scan a secondary hard-coded list to catch types that we can
// deduce but that we also want to allow the OS to override.

হার্ড-কোডেড তালিকাগুলি ফাইলটিতে কিছুটা আগে এসেছে: https://cs.chromium.org/chromium/src/net/base/mime_util.cc?l=170 ( kPrimaryMappingsএবং kSecondaryMappings)।

উদাহরণ: মাইক্রোসফ্ট এক্সেল ইনস্টল করা উইন্ডোজ সিস্টেম থেকে সিএসভি ফাইল আপলোড করার সময়, ক্রোম এটি হিসাবে রিপোর্ট করবে application/vnd.ms-excel। এটি কারণ .csvপ্রথম হার্ড-কোডেড তালিকায় নির্দিষ্ট করা হয়নি, তাই ব্রাউজারটি সিস্টেম রেজিস্ট্রিতে ফিরে আসে। সেট করা আছে HKEY_CLASSES_ROOT\.csvনামের একটি মান Content Typeআছে application/vnd.ms-excel

ইন্টারনেট এক্সপ্লোরার

আবার একই উদাহরণ ব্যবহার করে, ব্রাউজারটি রিপোর্ট করবে application/vnd.ms-excel। আমি মনে করি এটি ইন্টারনেট এক্সপ্লোরার (লেখার মতো 11 সংস্করণ) রেজিস্ট্রি ব্যবহার করে ধরে নেওয়া যুক্তিযুক্ত । সম্ভবত এটি ক্রোম এবং ফায়ারফক্সের মতো একটি হার্ড কোডিং তালিকা ব্যবহার করে তবে এর বদ্ধ উত্সের প্রকৃতি যাচাই করা শক্ত করে তোলে।

ফায়ারফক্স

ক্রোম কোডে নির্দেশিত হিসাবে, ফায়ারফক্স (লিখিতভাবে 32 সংস্করণ) একইভাবে কাজ করে। ফাইল uriloader\exthandler\nsExternalHelperAppService.cpp, পদ্ধতি থেকে স্নিপেটnsExternalHelperAppService::GetTypeFromExtension

// OK. We want to try the following sources of mimetype information, in this order:
// 1. defaultMimeEntries array
// 2. User-set preferences (managed by the handler service)
// 3. OS-provided information
// 4. our "extras" array
// 5. Information from plugins
// 6. The "ext-to-type-mapping" category

হার্ড-কোডেড তালিকাগুলি 441 লাইনের কাছাকাছি কোথাও ফাইলটিতে আগে এসেছিল You're আপনি সন্ধান করছেন defaultMimeEntriesএবং extraMimeEntries

আমার বর্তমান প্রোফাইলের সাথে, ব্রাউজারটি প্রতিবেদন করবে text/csvকারণ এটির জন্য একটি এন্ট্রি রয়েছে mimeTypes.rdf(উপরের তালিকার আইটেম 2)। একটি নতুন প্রোফাইল সহ, যাতে এই এন্ট্রি নেই, ব্রাউজারটি রিপোর্ট করবে application/vnd.ms-excel(তালিকার আইটেম 3)।

সারসংক্ষেপ

ব্রাউজারগুলির হার্ড-কোডড তালিকাগুলি বেশ সীমাবদ্ধ। প্রায়শই, ব্রাউজারের দ্বারা প্রেরিত মাইম টাইপটি ওএস দ্বারা রিপোর্ট করা হয়। এবং ঠিক এই কারণেই, প্রশ্নে যেমনটি বলা হয়েছে, ব্রাউজারের দ্বারা রিপোর্ট করা মাইম টাইপটি বিশ্বাসযোগ্য নয়।


4
ধন্যবাদ! আপনার কি ক্রোম উত্সের হার্ড-কোডেড তালিকার কোনও লিঙ্ক আছে?
10:44

@ কিপ হ্যাঁ, আমি একটি লিঙ্ক যুক্ত করেছি। ফায়ারফক্সের একটি (অফিশিয়াল) অনলাইন সোর্স কোড ব্রাউজার আছে বলে মনে হচ্ছে না, আমি তাদের এফটিপি সার্ভার থেকে এটি ডাউনলোড করতে হয়েছিল।
ব্যবহারকারী 247702

সিএসভি-র জন্য এমএস-এক্সেল হিসাবে MIME থাকা বিরক্তিকর, কেন এটি হার্ডকডযুক্ত তালিকায় নেই wonder
ক্রিস

এটা জানা চমৎকার যদি যেহেতু 2014. মাইম-টাইপ সনাক্তকরণ মধ্যে কিছু আপডেট ছিল হবে
ভিতালি Isaev

4
@ ভিটালিআইসিয়েভ ক্রোম কোডে একটি অলঙ্কার নজরে দেখায় যে এটি ২০১৪ সাল থেকে পরিবর্তিত হয়নি
ব্যবহারকারী 247702

12

কিপ, আমি আরএফসি, এমএসডিএন এবং এমডিএন পড়ার জন্য কিছু সময় ব্যয় করেছি। এখানে আমি বুঝতে পারি কি। যখন কোনও ব্রাউজার আপলোডের জন্য কোনও ফাইলের মুখোমুখি হয়, তখন এটি প্রাপ্ত ডেটার প্রথম বাফারের দিকে নজর দেয় এবং তারপরে এটি একটি পরীক্ষা চালায়। এই পরীক্ষাগুলিটি নির্ধারণ করার চেষ্টা করে যে ফাইলটি একটি পরিচিত মাইম টাইপ কিনা এবং যদি জানা মাইম টাইপ হয় তবে এটি কেবল এটি যাচাই করা মাইম টাইপের জন্য এটি পরীক্ষা করে এবং সেই অনুসারে ব্যবস্থা গ্রহণ করবে। আমি মনে করি IE কেবল এক্সটেনশন থেকে ফাইলের ধরণ নির্ধারণ করার চেয়ে প্রথমে এটি করার চেষ্টা করে। এই পৃষ্ঠাটি IE http://msdn.microsoft.com/en-us/library/ms775147%28v=vs.85%29.aspx- এর জন্য এটি ব্যাখ্যা করে । ফায়ারফক্সের জন্য, আমি যা বুঝতে পারি তা হ'ল এটি ফাইল সিস্টেম বা ডিরেক্টরি এন্ট্রি থেকে ফাইল তথ্য পড়ার চেষ্টা করে এবং তারপরে ফাইলের প্রকারটি নির্ধারণ করে। এফএফ https://developer.mozilla.org/en/XPCOM_Interface_References/nsIFile এর জন্য এখানে একটি লিঙ্ক রয়েছে। আমি এখনও এই বিষয়ে আরও অনুমোদনমূলক তথ্য পেতে চাই।


8

এটি সম্ভবত ওএস এবং সম্ভবত ব্রাউজার নির্ভর, তবে উইন্ডোজে কোনও প্রদত্ত ফাইল এক্সটেনশনের জন্য মাইমে টাইপ এইচকেসিআরের অধীনে রেজিস্ট্রিটি অনুসন্ধান করে পাওয়া যাবে:

উদাহরণ স্বরূপ:

HKEY_CLASSES_ROOT.zip - সামগ্রী টাইপ

মাইম থেকে ফাইল এক্সটেনশনে যেতে, আপনি নীচের কীগুলি দেখতে পারেন

HKEY_CLASSES_ROOT \ মাইম \ ডাটাবেস \ সামগ্রী প্রকার

কোনও নির্দিষ্ট মাইমির জন্য ডিফল্ট এক্সটেনশন পেতে get


ধন্যবাদ দুর্ভাগ্যক্রমে, আমি এবং আমার সহকর্মী উভয়ের জন্যই এটি আমাদের রেজিস্ট্রিতে সঠিক বলে মনে হয়। আমার ধারণা, এ কারণেই এটি তার জন্য আইআই-তে কাজ করেছিল, তবে এফএফ এটি একরকমভাবে পেয়েছে ... ওহ ভাল :(
কিপ করুন

5

যদিও এটি আপনার প্রশ্নের উত্তর নয় তবে এটি যে সমস্যার সমাধান করার চেষ্টা করছেন তা সমাধান করে। ওয়াইএমএমভি

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

আপনার যদি এখনও মাইম প্রকারের প্রয়োজন হয় তবে এটি সার্ভার-সাইড নির্ধারণ করতে আপনি নিজের অ্যাপাচের মাইম.প্রকারগুলি ব্যবহার করতে পারেন।


4
বিশদ যত্ন? আমার অভিজ্ঞতায় ব্রাউজারগুলি সর্বদা সঠিক আসল ফাইল নামটি প্রেরণ করে (এক্সটেনশান সহ) যখন মাইমির প্রকারগুলি ব্যাপকভাবে পরিবর্তিত হয়। তাই হ্যাঁ, আমি বলব এটি আরও বেশি নির্ভরযোগ্য।
জোহানোদো

সঠিক। আমি বলতে চাইছিলাম যে প্রকৃত প্রকার নির্বিশেষে শেষ ব্যবহারকারী কোনও প্রকার বাড়িয়ে দিতে পারেন, সুতরাং এটি বিশ্বাস করা উচিত নয়।
জিজিয়াস

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

আপনি ঠিক বলেছেন, আমার খারাপ প্রশ্নে মনোযোগ দিচ্ছেন না। আমি আমার ভোট বাতিল করতে পারি তবে আপনাকে তার উত্তর (সিস্টেম দ্বারা প্রয়োগ করা) সম্পাদনা করতে হবে ...
জিজিয়াস

হ্যাঁ, আমি জনদোদের সাথে একমত যেমন স্টিজন উপরের উত্তরটিতে ব্যাখ্যা করেছেন, ক্রোম এবং ফায়ারফক্স প্রথমে এক্সটেনশনটি পরীক্ষা করে। শেষ পর্যন্ত তারা একই কাজ করছে।
জেনিক্স

0

আমি jhndodo এর সাথে একমত, এমন অনেকগুলি ভেরিয়েবল রয়েছে যা মাইম প্রকারগুলি তৈরি করে যা ব্রাউজারগুলি থেকে অবিশ্বস্ত হয়। আমি প্রাপ্ত সাব-টাইপগুলি বাদ দিই এবং কেবল 'অ্যাপ্লিকেশন'-এর মতো ধরণের উপর ফোকাস করব। যদি আপনার অ্যাপ্লিকেশনটি পিএইচপি ভিত্তিক হয় তবে আপনি সহজেই ফাংশন বিস্ফোরণ () ব্যবহার করে এটি করতে পারেন। এছাড়াও, এটি ফাইলটি .zip বা আপনি যে কোনও সংকোচনের সন্ধান করছেন তা নিশ্চিত করার জন্য কেবল ফাইল এক্সটেনশানটি পরীক্ষা করুন!


0

Rfc1867 অনুসারে - এইচটিএমএলে ফর্ম-ভিত্তিক ফাইল আপলোড করুন :

মিডিয়া প্রকারটি (যেমন, ফাইল এক্সটেনশন বা অপারেটিং সিস্টেম টাইপিংয়ের তথ্য থেকে অনুমান করা) বা অ্যাপ্লিকেশন / অক্টেট-স্ট্রিম হিসাবে পরিচিত হলে প্রতিটি অংশকে উপযুক্ত বিষয়বস্তুর ধরণের লেবেলযুক্ত করা উচিত।

সুতরাং আমার বোধগম্যতা হ'ল application/octet-streamএক ধরণের blanket catch-allশনাক্তকারীর মতো যদি প্রকারটি অনুমান করা যায় না ।


হ্যাঁ, আমি এই সমস্ত বুঝতে পারি। প্রশ্নটি ছিল ব্রাউজারটি কীভাবে অনুমান করে।
কিপ

এটা যদিও জানার মূল্য আছে, তাই না? যদি application/octet-streamক্যাচ-অল হয়, তবে আর একটি পদ্ধতি হ'ল ব্রাউজারটি বিশ্বাস করতে পারে যদি এটি অনুমান করতে সক্ষম হয় এবং আপনি যদি পান তবে আপনার নিজের সার্ভারের পাশের পরীক্ষাগুলি করুন application/octet-stream
মাইকবেটন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.