.rar, .zip ไฟล์ประเภท MIME


156

ฉันกำลังพัฒนาสคริปต์อัพโหลด php อย่างง่ายและผู้ใช้สามารถอัปโหลดไฟล์ ZIP และ RAR เท่านั้น

ประเภทใดบ้างที่ฉันควรใช้ในการตรวจสอบ MIME $_FILES[x][type]? (โปรดระบุรายการทั้งหมด)

ขอบคุณ..



ฉันต้องการอนุญาตให้บีบอัดไฟล์ทั้งหมดเพียงอย่างเดียว (rar, zip, tar.gz, jar เป็นต้น) ขั้นตอนคืออะไร
Ridhuvarshan

คำตอบ:


258

คำตอบจาก Freedompeace, Kiyarash และ Sam Vloeberghs:

.rar    application/x-rar-compressed, application/octet-stream
.zip    application/zip, application/octet-stream, application/x-zip-compressed, multipart/x-zip

ฉันจะตรวจสอบชื่อไฟล์ด้วย นี่คือวิธีที่คุณสามารถตรวจสอบว่าไฟล์เป็นไฟล์ RAR หรือ ZIP ฉันทดสอบโดยสร้างแอปพลิเคชันบรรทัดคำสั่งด่วน

<?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 ก็สามารถตรวจจับไฟล์ RAR ที่ไม่ใช่เป็นไฟล์เก็บถาวรของ SFX:

$ rar.exe l somefile.srr
SFX Volume somefile.srr

2
multipart / x-zip เป็น mimetype ที่ถูกต้องสำหรับ. zip เช่นกัน (ไฟล์เก็บถาวร PKZIP)
Sam Vloeberghs

13
อันที่จริงมีอีก MIME TYPE สำหรับ zip และนั่นคือ:application/x-zip-compressed
Kiyarash

สิ่งนี้จะไม่รับประกันคุณzipหรือrarไฟล์เลย ตามข้อกำหนด WC3สิ่งนี้จะถูก intrepreted เป็น: "ฉันชอบapplication/zip| application/x-rar-compressedเนื้อหาประเภท แต่ถ้าคุณไม่สามารถส่งมอบนี้application/octet-stream(กระแสไฟล์) ก็ดี"
ร่วงโรย

1
นี่คือรายการประเภท mime ที่มีประโยชน์พร้อมด้วย. zip กลุ่มอื่น ๆ : sitepoint.com/web-foundations/mime-types-complete-list
sstauross

1
ในโลกนี้multipart/x-zipอาจจะใช้ได้อย่างไร มันไม่ได้มีหลายส่วน รายการ SitePoint มี MIME ที่ไม่ถูกต้องหลายประเภทและยังไม่สมบูรณ์ การลงทะเบียนประเภทสื่อของ IANAอย่างเป็นทางการนั้นยังไม่เสร็จสมบูรณ์ (หรือเป็นไปได้) 100%
Suncat2000

35

สำหรับการอัพโหลด:

รายชื่ออย่างเป็นทางการของประเภท mime ที่สามารถพบได้ที่อินเทอร์เน็ตได้กำหนดหมายเลข Authority (IANA) ตามรายการของพวกเขาContent-Typeส่วนหัวมีzipapplication/zip

ประเภทสื่อสำหรับrarไฟล์ที่ไม่ได้ลงทะเบียนอย่างเป็นทางการที่ IANA แต่ค่าชนิด mime application/x-rar-compressedอย่างไม่เป็นทางการที่ใช้กันทั่วไปคือ

application/octet-streamมีความหมายมากเท่ากับ: "ฉันส่งสตรีมไฟล์ให้คุณและไม่ได้ระบุเนื้อหาของสตรีมนี้" (ดังนั้นจึงเป็นเรื่องจริงที่มันอาจเป็นไฟล์zipหรือrarไฟล์ก็ได้เช่นกัน) เซิร์ฟเวอร์ควรตรวจสอบเนื้อหาที่แท้จริงของสตรีม

หมายเหตุ:สำหรับการอัปโหลดจะไม่ปลอดภัยที่จะพึ่งพาประเภท mime ที่ตั้งค่าไว้ในContent-Typeส่วนหัว ส่วนหัวตั้งอยู่บนไคลเอนต์และสามารถตั้งค่าสุ่มใด ๆ แต่คุณสามารถใช้ฟังก์ชั่นข้อมูลไฟล์ phpเพื่อตรวจจับไฟล์ mime-type บนเซิร์ฟเวอร์


สำหรับการดาวน์โหลด:

หากคุณต้องการดาวน์โหลดzipไฟล์และไม่มีอะไรอื่นคุณควรตั้งค่าAcceptส่วนหัวเดียวเท่านั้น ค่าเพิ่มเติมใด ๆ ที่ตั้งไว้จะถูกใช้เป็นทางเลือกในกรณีที่เซิร์ฟเวอร์ไม่สามารถตอบสนองคุณในAcceptส่วนหัวที่ร้องขอประเภท mime

ตามข้อกำหนด WC3นี้:

application/zip, application/octet-stream 

จะถูก intrepreted เป็น: "ฉันชอบapplication/zipmime-type แต่ถ้าคุณไม่สามารถส่งได้application/octet-stream(กระแสไฟล์) ก็ดี"

ดังนั้นเพียงคนเดียว:

application/zip

จะรับประกันzipไฟล์ (หรือ406 - Not Acceptableตอบกลับในกรณีที่เซิร์ฟเวอร์ไม่สามารถตอบสนองคำขอของคุณ)


5

คุณไม่ควรเชื่อถือ$_FILES['upfile']['mime']ตรวจสอบประเภท MIME ด้วยตัวเอง สำหรับวัตถุประสงค์นั้นคุณสามารถใช้fileinfoส่วนขยายเปิดใช้งานโดยค่าเริ่มต้นตั้งแต่ PHP 5.3.0

  $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

ในคำถามที่เชื่อมโยงมีโค้ด Objective-C บางส่วนเพื่อรับชนิด mime สำหรับ URL ไฟล์ ฉันได้สร้างส่วนขยาย Swift ตามรหัส Objective-C เพื่อรับประเภท mime:

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 ) ) { ///

เพื่อตรวจสอบอักขระทั้งหมดหลังจากที่ '.' สุดท้าย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.