2012-04-08 31 views
6

मैं php में एक अपलोड फॉर्म पर काम कर रहा हूं जो केवल एमपी 3 फ़ाइलों को अनुमति देनी चाहिए।माइम प्रकार का पता लगाने के लिए एक प्रकार की फाइल का पता लगाने का सबसे अच्छा तरीका है?

अपलोड होने पर मैं फ़ाइल का विश्लेषण करता हूं कि यह वास्तव में एक एमपी 3 है या नहीं। पहला कदम माइम प्रकार को "ऑडियो/एमपीईजी" के रूप में पहचानना है, मैं लाइब्रेरी finfo_file() का उपयोग करता हूं और इसके अलावा ठीक काम करता है कुछ एमपी 3 परीक्षणों को खारिज कर दिया जाता है क्योंकि उनके माइम प्रकार के परिणाम इस प्रकार होते हैं: एप्लिकेशन/ऑक्टेट-स्ट्रीम

मेरे प्रश्न हैं: - क्या मेरा ऐप निश्चित रूप से उन एमपी 3 से इंकार कर सकता है? वे वास्तव में ऑडियो खेलते हैं - क्या कोई कारण है कि यह माइम प्रकार एमपी 3 है? - माइम प्रकार का पता लगाने के लिए फ़ाइल की तरह जानने का सबसे निश्चित तरीका है?

उत्तर

0

यदि आप सही एमआईएम प्रकार प्रदान करने के लिए क्लाइंट पर विश्वास किए बिना फ़ाइल प्रकार का पता लगाने का एक बेहद मजबूत तरीका चाहते हैं, तो यूनिक्स पर file उपयोगिता का उपयोग करें।

$ file Black\ Sands\ 01\ Prelude.mp3 
Black Sands 01 Prelude.mp3: Audio file with ID3 version 2.2.0, contains: MPEG ADTS, layer III, v1, 320 kbps, 44.1 kHz, Stereo 

$ file homework/math475-hw8.docx 
homework/math475-hw8.docx: Microsoft Word 2007+ 

PHP में आप इसे लागू करने की exec फ़ंक्शन का उपयोग कर सकते हैं।

+0

यह एक ऐसा विकल्प है जिसे मैंने नहीं सोचा था .. और मैं परीक्षण नहीं कर सकता क्योंकि मैं – enkore

+0

जीत रहा हूं Win32 [here] के लिए संकलित एक संस्करण है (http://gnuwin32.sourceforge.net/packages/ file.htm)। –

+0

'file' आदेश और PHP के' finfo_file' समारोह माइम प्रकार का निर्धारण करने के लिए एक ही तरीके का उपयोग करें (आमतौर पर संदर्भित '/ usr/share/विविध/magic' द्वारा)। आपके पास अंतर्निहित फ़ंक्शन होने पर 'निष्पादन फ़ाइल' के लिए इसका कोई उपयोग नहीं है। हालांकि, मैं यहाँ है, जहां एक '.mp3' दोनों' finfo_file' द्वारा 'आवेदन/ओकटेट पर stream' और' फ़ाइल -I', के रूप में पता लगाया जा रहा है जब मैं इसे वापस करने के लिए उम्मीद करेंगे 'ऑडियो/mpeg' एक मामला है। दोनों असफल हो रहे हैं। हालांकि, मुझे लगता है कि इसे 'finfo_open' के दूसरे तर्क के रूप में एक बेहतर' जादू 'फ़ाइल के मार्ग को पारित करके हल किया जा सकता है। –

0

फ़ाइल पहचान का सबसे अच्छा तरीका एमआईएम के अलावा "जादू बाइट" या "जादू संख्या" योजना का उपयोग कर रहा है। यूनिक्स file (साथ ही finfo_file) वास्तव में इस फ़ाइल का पता लगाने के लिए "जादू बाइट्स" का उपयोग करता है। तो, संक्षेप में: हाँ।

अपनी फ़ाइल की तरह दिखने के बारे में चिंता न करें, और इसके बारे में अधिक जानकारी के साथ आप इसके साथ क्या कर सकते हैं। जब तक यह खेलता है, फ़ाइल ठीक होनी चाहिए।

यदि आप वास्तव में और करना चाहते हैं, तो आप जादू बाइट्स को स्वयं जांच सकते हैं। a list of them here है।

+0

इसलिए getid3() वर्ग मैं मिल "ऑडियो/एमपीईजी" लेकिन finfo_filei एक ही फाइल पर "application/ओकटेट धारा" मिल के साथ .. के साथ इस थोड़ा अजीब है .. लेकिन फ़ाइल चलाया जा सकता है, भले ही, यदि एक अलग माइम के साथ परिणाम टाइप यह सुरक्षा कारणों से अस्वीकृत कर दिए जाएंगे (जब तक मैं एक बेहतर तरीका खोजने के) .. मैं कितने mp3s एक सही माइम .. – enkore

+1

@enkore "मैं आश्चर्य नहीं है कि कितने mp3s एक सही माइम नहीं है आश्चर्य "एमआईएमई प्रकार क्लाइंट द्वारा आपूर्ति की जाती है। यह एमपी 3 फ़ाइल में निहित नहीं है। –

2

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

<?php 

$valid_mp3_mimes = array(
    'audio/mpeg', 
    'audio/x-mpeg', 
    'audio/mp3', 
    'audio/x-mp3', 
    'audio/mpeg3', 
    'audio/x-mpeg3', 
    'audio/x-mpeg-3', 
    'audio/mpg', 
    'audio/x-mpg', 
    'audio/x-mpegaudio', 
    'video/mpeg', 
    'video/x-mpeg', 
); 

$uploaded_file_mime = $_FILES['upload_field_name']['type']; 

if(!in_array($uploaded_file_mime, $valid_mp3_mimes)) 
{ 
    die('Upload is not a valid MP3 file.'); 
} 

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

ध्यान देने योग्य एक बात यह है कि सर्वर पर संसाधनों की उपलब्धता है जो आपको फ़ाइल के सही MIME प्रकार को प्रमाणित करने की अनुमति देती है।

PHP डेवलपर्स के रूप में, हम अधिकांश भाग के लिए प्लेटफ़ॉर्म स्वतंत्र कोड बनाने की लचीलापन पसंद करते हैं (उदाहरण के लिए XAMPP चल रहे विंडोज सिस्टम पर बनाए गए हमारे वेब एप्लिकेशन को बहुत कम संशोधन के साथ लिनक्स होस्टिंग वातावरण में तैनात किया जा सकता है)। हालांकि, एमआईएमई प्रकारों को सत्यापित करते समय, हम प्लेटफ़ॉर्म आश्रित विधियों को शुरू करना शुरू करते हैं जिन्हें इन उपकरणों के अस्तित्व की पुष्टि करने की आवश्यकता होती है (जैसे "फ़ाइल" या "finfo_file")।

यह (CodeIgniter GitHub भंडार से लिया गया) इन उपकरणों का इस्तेमाल करता है और एक काम उदाहरण के बारे में के रूप में पूरी तरह से है के रूप में आप PHP के दायरे के भीतर प्राप्त करने के लिए जा रहे हैं कि अध्ययन के एक कार्यान्वयन के लायक हो सकता है:

यदि फ़ाइल संभव हो, तो फ़ाइल MIME प्रकार अपलोड की गई फ़ाइल के (वास्तविक) MIME प्रकार का पता लगाता है। https://github.com/EllisLab/CodeIgniter/blob/develop/system/libraries/Upload.php#L983


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

पीएचपी मैनुअल POST पद्धति अपलोड - http://www.php.net/manual/en/features.file-upload.post-method.php

वेबमास्टर टूलकिट माइम प्रकार - http://www.webmaster-toolkit.com/mime-types.shtml

FILExt .mp3 फ़ाइल - http://filext.com/file-extension/MP3

संबंधित मुद्दे