.rar, .zip files Tipo MIME


156

Sto sviluppando un semplice script di caricamento php e gli utenti possono caricare solo file ZIP e RAR.

Quali tipi MIME dovrei usare per controllare $_FILES[x][type]? (un elenco completo per favore)

Grazie..



Voglio consentire tutti i file compressi da soli (rar, zip, tar.gz, jar etc), qual è la procedura?
Ridhuvarshan,

Risposte:


258

Le risposte di Freedompeace, Kiyarash e Sam Vloeberghs:

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

Vorrei fare un controllo anche sul nome del file. Ecco come è possibile verificare se il file è un file RAR o ZIP. L'ho provato creando un'applicazione rapida da riga di comando.

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

Nota che non sarà ancora sicuro al 100%, ma probabilmente è abbastanza buono.

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

Ma anche WinRAR rileva i file non RAR come archivi SFX:

$ rar.exe l somefile.srr
SFX Volume somefile.srr

2
multipart / x-zip è un mimetype valido anche per .zip (archivio PKZIP)
Sam Vloeberghs

13
in realtà c'è un altro MIME TYPE per zip, e cioè:application/x-zip-compressed
Kiyarash,

Questo non ti garantirà affatto un file zipo rar. Secondo le specifiche WC3 questo sarà intrepreted come: "Preferisco un application/zip| application/x-rar-compressedtipo di contenuto, ma se non è possibile consegnare questo un application/octet-stream(flusso di file) è anche bene".
Appassionato il

1
Ecco un utile elenco di tipi di mime con .zip tra gli altri: sitepoint.com/web-foundations/mime-types-complete-list
sstauross

1
Come nel mondo potrebbe multipart/x-zipessere valido? Non è multiparte. L'elenco SitePoint contiene molti tipi MIME non accurati ed è tutt'altro che completo. Il registro ufficiale dei tipi di media IANA non è (né sarà probabilmente mai) completo al 100%.
Suncat2000,

35

Per il caricamento:

Un elenco ufficiale dei tipi di mime è disponibile su Internet Assigned Numbers Authority (IANA) . Secondo l' Content-Typeintestazione della loro lista per zipèapplication/zip .

Il tipo di supporto per i rarfile non è ufficialmente registrato presso IANA, ma è il valore non ufficiale di tipo mime comunemente usatoapplication/x-rar-compressed .

application/octet-streamsignifica quanto segue : "Ti invio un flusso di file e il contenuto di questo flusso non è specificato" (quindi è vero che può essere anche un file zipo rar). Si suppone che il server rilevi quale sia il contenuto effettivo del flusso.

Nota: per il caricamento non è sicuro fare affidamento sul tipo mime impostato Content-Typenell'intestazione. L'intestazione è impostata sul client e può essere impostata su qualsiasi valore casuale. Invece è possibile utilizzare le funzioni di informazioni sul file php per rilevare il file mime-type sul server.


Per il download:

Se si desidera scaricare un zipfile e nient'altro, è necessario impostare un solo Acceptvalore di intestazione. Eventuali valori aggiuntivi impostati verranno utilizzati come fallback nel caso in cui il server non sia in grado di soddisfare l' Acceptintestazione richiesta tipo mime.

Secondo le specifiche WC3 questo:

application/zip, application/octet-stream 

verrà interpretato come: "Preferisco un application/ziptipo MIME, ma se non riesci a consegnarlo anche un application/octet-stream(un flusso di file) va bene".

Quindi solo un singolo:

application/zip

Ti garantirà un zipfile (o una 406 - Not Acceptablerisposta nel caso in cui il server non sia in grado di soddisfare la tua richiesta).


5

Non dovresti fidarti $_FILES['upfile']['mime'], controlla il tipo MIME da solo. A tale scopo, è possibile utilizzare l' fileinfoestensione , abilitata per impostazione predefinita a partire da 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.');

NOTA: non dimenticare di abilitare l'estensione nel tuo php.inie riavviare il server:

extension=php_fileinfo.dll

0

In una domanda collegata , c'è del codice Objective-C per ottenere il tipo mime per un URL di file. Ho creato un'estensione Swift basata su quel codice Objective-C per ottenere il tipo 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
    }
}

-2

Poiché l'estensione può contenere più o meno di tre caratteri, il seguente testerà un'estensione indipendentemente dalla sua lunghezza.

Prova questo:

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

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

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

per controllare tutti i personaggi dopo l'ultimo '.'

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.