Basit bir php yükleme komut dosyası geliştiriyorum ve kullanıcılar yalnızca ZIP ve RAR dosyalarını yükleyebilir.
Kontrol etmek için hangi MIME türlerini kullanmalıyım $_FILES[x][type]
? (tam bir liste lütfen)
Teşekkür ederim..
Basit bir php yükleme komut dosyası geliştiriyorum ve kullanıcılar yalnızca ZIP ve RAR dosyalarını yükleyebilir.
Kontrol etmek için hangi MIME türlerini kullanmalıyım $_FILES[x][type]
? (tam bir liste lütfen)
Teşekkür ederim..
Yanıtlar:
Freedompeace, Kiyarash ve Sam Vloeberghs'in cevapları:
.rar application/x-rar-compressed, application/octet-stream
.zip application/zip, application/octet-stream, application/x-zip-compressed, multipart/x-zip
Ben de dosya adını kontrol ederdim. Dosyanın bir RAR veya ZIP dosyası olup olmadığını nasıl kontrol edebileceğiniz aşağıda açıklanmıştır. Hızlı bir komut satırı uygulaması oluşturarak test ettim.
<?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;
}
Hala% 100 kesin olmayacağına dikkat edin, ancak muhtemelen yeterince iyi.
$ rar.exe l somefile.zip
somefile.zip is not RAR archive
Ancak WinRAR bile RAR olmayan dosyaları SFX arşivleri olarak algılar:
$ rar.exe l somefile.srr
SFX Volume somefile.srr
application/x-zip-compressed
zip
veya rar
dosya garantisi vermeyecektir . Göre WC3 özelliklerine bu kadar intrepreted edilecektir: "Ben bir tercih application/zip
| application/x-rar-compressed
içerik türünü, ancak bu bir yayınlayamazsa application/octet-stream
(dosya akışı) ince de".
multipart/x-zip
geçerli olabilir ? Çok parçalı değil. SitePoint listesi birçok yanlış MIME türü içerir ve bu liste tam olmaktan uzaktır. Resmi IANA Medya Türleri kaydı % 100 tamamlanmamıştır (muhtemelen olmayacaktır).
MIME türlerinin resmi bir listesi İnternet Tahsisli Sayılar Kurumu'nda (IANA) bulunabilir . Onların liste uyarınca Content-Type
için başlığındaki zip
DİR application/zip
.
rar
Dosyalar için ortam türü resmi olarak IANA'da kayıtlı değil ancak yaygın olarak kullanılan resmi olmayan mime türü değeri application/x-rar-compressed
.
application/octet-stream
şu anlama gelir: "Size bir dosya akışı gönderirim ve bu akışın içeriği belirtilmez" (bu nedenle bir zip
veya rar
dosya olabileceği doğrudur ). Sunucunun, akışın gerçek içeriğinin ne olduğunu algılaması gerekir.
Not: Yükleme için, Content-Type
başlıkta ayarlanan mime tipine güvenmek güvenli değildir . Üstbilgi istemcide ayarlanır ve herhangi bir rastgele değere ayarlanabilir. Bunun yerine , sunucudaki dosya mime türünü algılamak için php dosya bilgisi işlevlerini kullanabilirsiniz.
Bir zip
dosyayı indirmek ve başka bir şey indirmek istemiyorsanız , yalnızca tek bir Accept
başlık değeri ayarlamanız gerekir . Sunucunun Accept
istenen üstbilgi mime türünde sizi karşılayamaması durumunda, ayarlanan ek değerler bir yedek olarak kullanılacaktır .
Göre WC3 özelliklerine bu:
application/zip, application/octet-stream
: olarak intrepreted edilecektir "Ben tercih application/zip
mim tipi, ancak bu bir yayınlayamazsa application/octet-stream
(bir dosya akışı) ince de".
Yani sadece bir tane:
application/zip
Size bir zip
dosya (veya 406 - Not Acceptable
sunucunun isteğinizi yerine getirememesi durumunda yanıt) garantisi verir .
Güvenmemelisiniz $_FILES['upfile']['mime']
, MIME türünü kendiniz kontrol edin. Bu amaçla, PHP 5.3.0'dan itibaren varsayılan olarak etkin olan fileinfo
uzantıyı kullanabilirsiniz .
$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.');
NOT: İçinde uzantıyı etkinleştirmeyi php.ini
ve sunucunuzu yeniden başlatmayı unutmayın:
extension=php_fileinfo.dll
In bağlantılı bir soruya , bir dosya URL için MIME türü almak için bazı Objective-C kodu var. MIME türünü almak için bu Objective-C kodunu temel alan bir Swift uzantısı oluşturdum:
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
}
}
Uzantı üç karakterden daha fazla veya daha az içerebileceğinden, aşağıdakiler uzunluğuna bakılmaksızın bir uzantıyı test edecektir.
Bunu dene:
$allowedExtensions = array( 'mkv', 'mp3', 'flac' );
$temp = explode(".", $_FILES[$file]["name"]);
$extension = strtolower(end($temp));
if( in_array( $extension, $allowedExtensions ) ) { ///
sondan sonraki tüm karakterleri kontrol etmek için '.'