मैं एक साधारण php अपलोड स्क्रिप्ट विकसित कर रहा हूं, और उपयोगकर्ता केवल ZIP और RAR फाइल कर सकते हैं।
मुझे जाँच करने के लिए किस MIME प्रकार का उपयोग करना चाहिए $_FILES[x][type]
? (पूरी सूची कृपया)
धन्यवाद..
मैं एक साधारण php अपलोड स्क्रिप्ट विकसित कर रहा हूं, और उपयोगकर्ता केवल ZIP और RAR फाइल कर सकते हैं।
मुझे जाँच करने के लिए किस MIME प्रकार का उपयोग करना चाहिए $_FILES[x][type]
? (पूरी सूची कृपया)
धन्यवाद..
जवाबों:
स्वतंत्रतापीठ, कियाराश और सैम क्लोएबरघस के जवाब:
.rar application/x-rar-compressed, application/octet-stream
.zip application/zip, application/octet-stream, application/x-zip-compressed, multipart/x-zip
मैं फ़ाइल नाम पर भी एक जाँच करूँगा। यहाँ आप देख सकते हैं कि फ़ाइल R या ज़िप फ़ाइल है या नहीं। मैंने एक त्वरित कमांड लाइन एप्लिकेशन बनाकर इसका परीक्षण किया।
<?php
if (isRarOrZip($argv[1])) {
echo 'It is probably a RAR or ZIP file.';
} else {
echo 'It is probably not a RAR or ZIP file.';
}
function isRarOrZip($file) {
// get the first 7 bytes
$bytes = file_get_contents($file, FALSE, NULL, 0, 7);
$ext = strtolower(substr($file, - 4));
// RAR magic number: Rar!\x1A\x07\x00
// http://en.wikipedia.org/wiki/RAR
if ($ext == '.rar' and bin2hex($bytes) == '526172211a0700') {
return TRUE;
}
// ZIP magic number: none, though PK\003\004, PK\005\006 (empty archive),
// or PK\007\008 (spanned archive) are common.
// http://en.wikipedia.org/wiki/ZIP_(file_format)
if ($ext == '.zip' and substr($bytes, 0, 2) == 'PK') {
return TRUE;
}
return FALSE;
}
ध्यान दें कि यह अभी भी 100% निश्चित नहीं होगा, लेकिन यह संभवतः काफी अच्छा है।
$ rar.exe l somefile.zip
somefile.zip is not RAR archive
लेकिन यहां तक कि WinRAR ने SFX अभिलेखागार के रूप में गैर RAR फ़ाइलों का पता लगाया:
$ rar.exe l somefile.srr
SFX Volume somefile.srr
application/x-zip-compressed
zip
या rar
फ़ाइल की गारंटी नहीं देगा । के अनुसार WC3 विनिर्देशों इस रूप में intrepreted किया जाएगा: "मैं एक पसंद करते हैं application/zip
| application/x-rar-compressed
सामग्री प्रकार, लेकिन आप इस एक नहीं दिखा सकता, अगर application/octet-stream
(फ़ाइल स्ट्रीम) भी ठीक है।"
multipart/x-zip
संभवतः मान्य हो सकता है? यह बहु-भाग नहीं है। SitePoint सूची में कई गलत MIME प्रकार हैं और यह पूर्ण से बहुत दूर है। आधिकारिक IANA मीडिया प्रकार की रजिस्ट्री 100% पूर्ण नहीं है (और न ही इसकी संभावना होगी)।
माइम प्रकारों की एक आधिकारिक सूची इंटरनेट असाइनमेंट नंबर अथॉरिटी (IANA) में पाई जा सकती है । उनकी सूची के अनुसार Content-Type
हैडर zip
है application/zip
।
rar
फ़ाइलों के लिए मीडिया प्रकार आधिकारिक तौर पर IANA में पंजीकृत नहीं है, लेकिन अनधिकृत आमतौर पर इस्तेमाल किया जाने वाला माइम-प्रकार मूल्य है application/x-rar-compressed
।
application/octet-stream
इसका जितना अर्थ है: "मैं आपको एक फ़ाइल स्ट्रीम भेजता हूं और इस स्ट्रीम की सामग्री निर्दिष्ट नहीं है" (इसलिए यह सच है कि यह एक zip
या rar
फाइल भी हो सकती है)। सर्वर को यह पता लगाना चाहिए कि स्ट्रीम की वास्तविक सामग्री क्या है।
नोट: अपलोड के लिए यह Content-Type
शीर्ष लेख में निर्धारित माइम प्रकार पर निर्भर होना सुरक्षित नहीं है । शीर्ष लेख क्लाइंट पर सेट किया गया है और इसे किसी भी यादृच्छिक मूल्य पर सेट किया जा सकता है। इसके बजाय आप सर्वर पर फ़ाइल माइम-प्रकार का पता लगाने के लिए php फ़ाइल जानकारी फ़ंक्शन का उपयोग कर सकते हैं ।
यदि आप एक zip
फ़ाइल डाउनलोड करना चाहते हैं और कुछ नहीं तो आपको केवल एक ही Accept
हेडर मान सेट करना चाहिए । सर्वर द्वारा Accept
हेडर-टाइप किए गए शीर्ष लेख में संतुष्ट नहीं होने की स्थिति में सेट किए गए किसी भी अतिरिक्त मान का उपयोग फ़ॉलबैक के रूप में किया जाएगा ।
WC3 विनिर्देशों के अनुसार यह:
application/zip, application/octet-stream
के रूप में समझा जाएगा: "मैं एक application/zip
माइम-प्रकार पसंद करता हूं , लेकिन यदि आप इसे वितरित नहीं कर सकते हैं तो application/octet-stream
(एक फ़ाइल स्ट्रीम) भी ठीक है"।
तो केवल एक ही:
application/zip
आपको एक zip
फ़ाइल की गारंटी देगा (या 406 - Not Acceptable
यदि सर्वर आपके अनुरोध को पूरा करने में असमर्थ है तो प्रतिक्रिया)।
आपको भरोसा नहीं करना चाहिए $_FILES['upfile']['mime']
, अपने आप से MIME प्रकार की जांच करें। उस प्रयोजन के लिए, आप PHP 5.3.0 के अनुसार डिफ़ॉल्ट रूप से सक्षम fileinfo
एक्सटेंशन का उपयोग कर सकते हैं ।
$fileInfo = new finfo(FILEINFO_MIME_TYPE);
$fileMime = $fileInfo->file($_FILES['upfile']['tmp_name']);
$validMimes = array(
'zip' => 'application/zip',
'rar' => 'application/x-rar',
);
$fileExt = array_search($fileMime, $validMimes, true);
if($fileExt != 'zip' && $fileExt != 'rar')
throw new RuntimeException('Invalid file format.');
नोट: अपने में एक्सटेंशन को सक्षम करने php.ini
और अपने सर्वर को पुनरारंभ करने के लिए मत भूलना :
extension=php_fileinfo.dll
में किसी लिंक किए गए सवाल , वहाँ कुछ ऑब्जेक्टिव-सी कोड एक फ़ाइल यूआरएल के लिए माइम प्रकार प्राप्त करने के लिए है। मैंने माइम प्रकार प्राप्त करने के लिए उस उद्देश्य-सी कोड के आधार पर एक स्विफ्ट एक्सटेंशन बनाया है:
import Foundation
import MobileCoreServices
extension URL {
var mimeType: String? {
guard self.pathExtension.count != 0 else {
return nil
}
let pathExtension = self.pathExtension as CFString
if let preferredIdentifier = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, pathExtension, nil) {
guard let mimeType = UTTypeCopyPreferredTagWithClass(preferredIdentifier.takeRetainedValue(), kUTTagClassMIMEType) else {
return nil
}
return mimeType.takeRetainedValue() as String
}
return nil
}
}
जैसा कि विस्तार में कम या ज्यादा हो सकता है कि तीन वर्ण निम्नलिखित विस्तार के लिए परीक्षण करेंगे चाहे इसकी लंबाई कितनी भी हो।
इसे इस्तेमाल करे:
$allowedExtensions = array( 'mkv', 'mp3', 'flac' );
$temp = explode(".", $_FILES[$file]["name"]);
$extension = strtolower(end($temp));
if( in_array( $extension, $allowedExtensions ) ) { ///
अंतिम के बाद सभी वर्णों की जांच करना। '