ฉันกำลังพัฒนาสคริปต์อัพโหลด php อย่างง่ายและผู้ใช้สามารถอัปโหลดไฟล์ ZIP และ RAR เท่านั้น
ประเภทใดบ้างที่ฉันควรใช้ในการตรวจสอบ MIME $_FILES[x][type]
? (โปรดระบุรายการทั้งหมด)
ขอบคุณ..
ฉันกำลังพัฒนาสคริปต์อัพโหลด php อย่างง่ายและผู้ใช้สามารถอัปโหลดไฟล์ ZIP และ RAR เท่านั้น
ประเภทใดบ้างที่ฉันควรใช้ในการตรวจสอบ MIME $_FILES[x][type]
? (โปรดระบุรายการทั้งหมด)
ขอบคุณ..
คำตอบ:
คำตอบจาก 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
application/x-zip-compressed
zip
หรือrar
ไฟล์เลย ตามข้อกำหนด WC3สิ่งนี้จะถูก intrepreted เป็น: "ฉันชอบapplication/zip
| application/x-rar-compressed
เนื้อหาประเภท แต่ถ้าคุณไม่สามารถส่งมอบนี้application/octet-stream
(กระแสไฟล์) ก็ดี"
multipart/x-zip
อาจจะใช้ได้อย่างไร มันไม่ได้มีหลายส่วน รายการ SitePoint มี MIME ที่ไม่ถูกต้องหลายประเภทและยังไม่สมบูรณ์ การลงทะเบียนประเภทสื่อของ IANAอย่างเป็นทางการนั้นยังไม่เสร็จสมบูรณ์ (หรือเป็นไปได้) 100%
รายชื่ออย่างเป็นทางการของประเภท mime ที่สามารถพบได้ที่อินเทอร์เน็ตได้กำหนดหมายเลข Authority (IANA) ตามรายการของพวกเขาContent-Type
ส่วนหัวมีzip
application/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/zip
mime-type แต่ถ้าคุณไม่สามารถส่งได้application/octet-stream
(กระแสไฟล์) ก็ดี"
ดังนั้นเพียงคนเดียว:
application/zip
จะรับประกันzip
ไฟล์ (หรือ406 - Not Acceptable
ตอบกลับในกรณีที่เซิร์ฟเวอร์ไม่สามารถตอบสนองคำขอของคุณ)
คุณไม่ควรเชื่อถือ$_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
ในคำถามที่เชื่อมโยงมีโค้ด 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
}
}
ในฐานะที่เป็นส่วนขยายอาจมีมากกว่าหรือน้อยกว่าที่สามตัวอักษรต่อไปนี้จะทดสอบการขยายโดยไม่คำนึงถึงความยาวของมัน
ลองสิ่งนี้:
$allowedExtensions = array( 'mkv', 'mp3', 'flac' );
$temp = explode(".", $_FILES[$file]["name"]);
$extension = strtolower(end($temp));
if( in_array( $extension, $allowedExtensions ) ) { ///
เพื่อตรวจสอบอักขระทั้งหมดหลังจากที่ '.' สุดท้าย