.rar, .zip फाइलें MIME टाइप करें


156

मैं एक साधारण php अपलोड स्क्रिप्ट विकसित कर रहा हूं, और उपयोगकर्ता केवल ZIP और RAR फाइल कर सकते हैं।

मुझे जाँच करने के लिए किस MIME प्रकार का उपयोग करना चाहिए $_FILES[x][type]? (पूरी सूची कृपया)

धन्यवाद..



मैं सभी संपीड़ित फ़ाइलों को अकेले (rar, zip, tar.gz, jar etc) की अनुमति देना चाहता हूं, प्रक्रिया क्या है?
रिधुदर्शन

जवाबों:


258

स्वतंत्रतापीठ, कियाराश और सैम क्लोएबरघस के जवाब:

.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

2
मल्टीपार्ट / x-zip .zip और साथ ही (PKZIP आर्काइव) के लिए एक मान्य
mimetype है

13
वास्तव में ज़िप के लिए एक और MIME TYPE है, और वह है:application/x-zip-compressed
Kiyarash

यह आपको zipया rarफ़ाइल की गारंटी नहीं देगा । के अनुसार WC3 विनिर्देशों इस रूप में intrepreted किया जाएगा: "मैं एक पसंद करते हैं application/zip| application/x-rar-compressedसामग्री प्रकार, लेकिन आप इस एक नहीं दिखा सकता, अगर application/octet-stream(फ़ाइल स्ट्रीम) भी ठीक है।"
विल्ट

1
यहाँ अन्य प्रकारों के साथ माइम प्रकारों की उपयोगी सूची दी गई है: sitepoint.com/web-foundations/mime-types-complete-list
sstauross

1
कैसे दुनिया में multipart/x-zipसंभवतः मान्य हो सकता है? यह बहु-भाग नहीं है। SitePoint सूची में कई गलत MIME प्रकार हैं और यह पूर्ण से बहुत दूर है। आधिकारिक IANA मीडिया प्रकार की रजिस्ट्री 100% पूर्ण नहीं है (और न ही इसकी संभावना होगी)।
सनकैट २२

35

अपलोड के लिए:

माइम प्रकारों की एक आधिकारिक सूची इंटरनेट असाइनमेंट नंबर अथॉरिटी (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यदि सर्वर आपके अनुरोध को पूरा करने में असमर्थ है तो प्रतिक्रिया)।


5

आपको भरोसा नहीं करना चाहिए $_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

0

में किसी लिंक किए गए सवाल , वहाँ कुछ ऑब्जेक्टिव-सी कोड एक फ़ाइल यूआरएल के लिए माइम प्रकार प्राप्त करने के लिए है। मैंने माइम प्रकार प्राप्त करने के लिए उस उद्देश्य-सी कोड के आधार पर एक स्विफ्ट एक्सटेंशन बनाया है:

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

-2

जैसा कि विस्तार में कम या ज्यादा हो सकता है कि तीन वर्ण निम्नलिखित विस्तार के लिए परीक्षण करेंगे चाहे इसकी लंबाई कितनी भी हो।

इसे इस्तेमाल करे:

$allowedExtensions = array( 'mkv', 'mp3', 'flac' );

$temp = explode(".", $_FILES[$file]["name"]);
$extension = strtolower(end($temp));

if( in_array( $extension, $allowedExtensions ) ) { ///

अंतिम के बाद सभी वर्णों की जांच करना। '

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