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..
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..
Jawaban:
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
application/x-zip-compressed
zip
atau rar
file sama sekali. Menurut spesifikasi WC3 ini akan diinterpretasikan sebagai: "Saya lebih suka application/zip
| application/x-rar-compressed
jenis konten, tetapi jika Anda tidak dapat memberikan ini sebuah application/octet-stream
(stream file) juga baik-baik saja".
multipart/x-zip
mungkin 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.
Daftar resmi tipe mime dapat ditemukan di Internet Assigned Numbers Authority (IANA) . Menurut Content-Type
header daftar mereka zip
adalah application/zip
.
Jenis media untuk rar
file tidak terdaftar secara resmi di IANA tetapi nilai tipe mime tidak resmi yang umum digunakan adalah application/x-rar-compressed
.
application/octet-stream
berarti sebanyak: "Saya mengirim Anda aliran file dan konten aliran ini tidak ditentukan" (jadi memang benar bahwa itu bisa berupa file zip
atau rar
juga). Server seharusnya mendeteksi apa isi sebenarnya dari aliran itu.
Catatan: Untuk mengunggah, tidak aman untuk mengandalkan tipe pantomim yang diatur di Content-Type
header. 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.
Jika Anda ingin mengunduh zip
file dan tidak ada yang lain, Anda hanya perlu menetapkan satu Accept
nilai header tunggal . Nilai tambahan apa pun yang ditetapkan akan digunakan sebagai fallback jika server tidak dapat memenuhi Anda dalam jenis Accept
mime yang diminta header.
Menurut spesifikasi WC3 ini:
application/zip, application/octet-stream
akan diinterpretasikan sebagai: "Saya lebih suka tipe application/zip
mime, tetapi jika Anda tidak dapat memberikan ini application/octet-stream
(aliran file) juga baik-baik saja".
Jadi hanya satu:
application/zip
Akan menjamin Anda zip
file (atau 406 - Not Acceptable
tanggapan jika server tidak dapat memenuhi permintaan Anda).
Anda tidak boleh percaya $_FILES['upfile']['mime']
, periksa sendiri jenis MIME. Untuk tujuan itu, Anda dapat menggunakan fileinfo
ekstensi , 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.ini
dan mulai ulang server Anda:
extension=php_fileinfo.dll
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
}
}
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 '.'