.rar, .zip dosyaları MIME Türü


156

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..



Tüm sıkıştırılmış dosyalara izin vermek istiyorum (rar, zip, tar.gz, kavanoz vb.), Prosedür nedir?
Ridhuvarshan

Yanıtlar:


258

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

2
multipart / x-zip, .zip için de geçerli bir
mimetype

13
aslında zip için başka bir MIME TİPİ var ve bu:application/x-zip-compressed
Kiyarash

Bu size bir zipveya rardosya garantisi vermeyecektir . Göre WC3 özelliklerine bu kadar intrepreted edilecektir: "Ben bir tercih application/zip| application/x-rar-compressediçerik türünü, ancak bu bir yayınlayamazsa application/octet-stream(dosya akışı) ince de".
Wilt

1
İşte diğerleri arasında .zip ile mim türleri belirlemede kullanışlı bir listesi: sitepoint.com/web-foundations/mime-types-complete-list
sstauross

1
Dünyada nasıl multipart/x-zipgeç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).
Suncat2000

35

Yükleme için:

MIME türlerinin resmi bir listesi İnternet Tahsisli Sayılar Kurumu'nda (IANA) bulunabilir . Onların liste uyarınca Content-Typeiçin başlığındaki zipDİR application/zip.

rarDosyalar 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 zipveya rardosya olabileceği doğrudur ). Sunucunun, akışın gerçek içeriğinin ne olduğunu algılaması gerekir.

Not: Yükleme için, Content-Typebaş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.


İndirmek için:

Bir zipdosyayı indirmek ve başka bir şey indirmek istemiyorsanız , yalnızca tek bir Acceptbaşlık değeri ayarlamanız gerekir . Sunucunun Acceptistenen ü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/zipmim tipi, ancak bu bir yayınlayamazsa application/octet-stream(bir dosya akışı) ince de".

Yani sadece bir tane:

application/zip

Size bir zipdosya (veya 406 - Not Acceptablesunucunun isteğinizi yerine getirememesi durumunda yanıt) garantisi verir .


5

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 fileinfouzantı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.inive sunucunuzu yeniden başlatmayı unutmayın:

extension=php_fileinfo.dll

0

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

-2

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 '.'

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.