File .rar, .zip Jenis MIME

156

Saya sedang mengembangkan skrip unggah php sederhana, dan pengguna hanya dapat mengunggah file ZIP dan RAR.

Jenis MIME apa yang harus saya gunakan untuk memeriksa $_FILES[x][type]? (daftar lengkap silakan)

Terima kasih..

mrdaliri
sumber
Saya ingin mengizinkan semua file terkompresi saja (rar, zip, tar.gz, jar, dll), bagaimana prosedurnya?
Ridhuvarshan

Jawaban:

258

Jawaban dari freedompeace, Kiyarash dan Sam Vloeberghs:

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

Saya akan melakukan pemeriksaan pada nama file juga. Inilah cara Anda dapat memeriksa apakah file tersebut adalah file RAR atau ZIP. Saya mengujinya dengan membuat aplikasi baris perintah cepat.

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

Perhatikan bahwa itu masih belum pasti 100%, tetapi mungkin cukup baik.

$ rar.exe l somefile.zip
somefile.zip is not RAR archive

Tetapi bahkan WinRAR mendeteksi file non RAR sebagai arsip SFX:

$ rar.exe l somefile.srr
SFX Volume somefile.srr
Gfy
sumber
2
multipart / x-zip adalah mimetype yang valid untuk .zip juga (arsip PKZIP)
Sam Vloeberghs
13
sebenarnya ada JENIS MIME lain untuk zip, dan itu:application/x-zip-compressed
Kiyarash
Ini tidak akan menjamin Anda zipatau rarfile sama sekali. Menurut spesifikasi WC3 ini akan diinterpretasikan sebagai: "Saya lebih suka application/zip| application/x-rar-compressedjenis konten, tetapi jika Anda tidak dapat memberikan ini sebuah application/octet-stream(stream file) juga baik-baik saja".
Wilt
1
Berikut adalah daftar berguna dari jenis mime dengan .zip antara lain: sitepoint.com/web-foundations/mime-types-complete-list
sstauross
1
Bagaimana multipart/x-zipmungkin dunia ini valid? Ini bukan multi-bagian. Daftar SitePoint berisi banyak tipe MIME yang tidak akurat dan jauh dari lengkap. Registri resmi Jenis Media IANA tidak (juga kemungkinan tidak akan) 100% selesai.
Suncat2000
35

Untuk mengunggah:

Daftar resmi tipe mime dapat ditemukan di Internet Assigned Numbers Authority (IANA) . Menurut Content-Typeheader daftar mereka zipadalah application/zip.

Jenis media untuk rarfile tidak terdaftar secara resmi di IANA tetapi nilai tipe mime tidak resmi yang umum digunakan adalah application/x-rar-compressed.

application/octet-streamberarti sebanyak: "Saya mengirim Anda aliran file dan konten aliran ini tidak ditentukan" (jadi memang benar bahwa itu bisa berupa file zipatau rarjuga). Server seharusnya mendeteksi apa isi sebenarnya dari aliran itu.

Catatan: Untuk mengunggah, tidak aman untuk mengandalkan tipe pantomim yang diatur di Content-Typeheader. Header diatur pada klien dan dapat diatur ke nilai acak apa pun. Sebagai gantinya, Anda dapat menggunakan fungsi info file php untuk mendeteksi tipe mime file di server.


Untuk diunduh:

Jika Anda ingin mengunduh zipfile dan tidak ada yang lain, Anda hanya perlu menetapkan satu Acceptnilai header tunggal . Nilai tambahan apa pun yang ditetapkan akan digunakan sebagai fallback jika server tidak dapat memenuhi Anda dalam jenis Acceptmime yang diminta header.

Menurut spesifikasi WC3 ini:

application/zip, application/octet-stream 

akan diinterpretasikan sebagai: "Saya lebih suka tipe application/zipmime, tetapi jika Anda tidak dapat memberikan ini application/octet-stream(aliran file) juga baik-baik saja".

Jadi hanya satu:

application/zip

Akan menjamin Anda zipfile (atau 406 - Not Acceptabletanggapan jika server tidak dapat memenuhi permintaan Anda).

Melayu
sumber
5

Anda tidak boleh percaya $_FILES['upfile']['mime'], periksa sendiri jenis MIME. Untuk tujuan itu, Anda dapat menggunakan fileinfoekstensi , diaktifkan secara default pada 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.');

CATATAN: Jangan lupa untuk mengaktifkan ekstensi di Anda php.inidan mulai ulang server Anda:

extension=php_fileinfo.dll
fibriZo raZiel
sumber
0

Dalam pertanyaan yang ditautkan , ada beberapa kode Objective-C untuk mendapatkan jenis mime untuk URL file. Saya telah membuat ekstensi Swift berdasarkan kode Objective-C untuk mendapatkan tipe 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
    }
}
Wolfgang Schreurs
sumber
-2

Karena ekstensi mungkin mengandung lebih atau kurang dari tiga karakter, maka berikut ini akan diuji untuk ekstensi terlepas dari panjangnya.

Coba ini:

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

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

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

untuk memeriksa semua karakter setelah '.'

theking2
sumber