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..
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..
Risposte:
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
application/x-zip-compressed
zip
o rar
. Secondo le specifiche WC3 questo sarà intrepreted come: "Preferisco un application/zip
| application/x-rar-compressed
tipo di contenuto, ma se non è possibile consegnare questo un application/octet-stream
(flusso di file) è anche bene".
multipart/x-zip
essere 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%.
Un elenco ufficiale dei tipi di mime è disponibile su Internet Assigned Numbers Authority (IANA) . Secondo l' Content-Type
intestazione della loro lista per zip
èapplication/zip
.
Il tipo di supporto per i rar
file non è ufficialmente registrato presso IANA, ma è il valore non ufficiale di tipo mime comunemente usatoapplication/x-rar-compressed
.
application/octet-stream
significa quanto segue : "Ti invio un flusso di file e il contenuto di questo flusso non è specificato" (quindi è vero che può essere anche un file zip
o 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-Type
nell'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.
Se si desidera scaricare un zip
file e nient'altro, è necessario impostare un solo Accept
valore di intestazione. Eventuali valori aggiuntivi impostati verranno utilizzati come fallback nel caso in cui il server non sia in grado di soddisfare l' Accept
intestazione richiesta tipo mime.
Secondo le specifiche WC3 questo:
application/zip, application/octet-stream
verrà interpretato come: "Preferisco un application/zip
tipo 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 zip
file (o una 406 - Not Acceptable
risposta nel caso in cui il server non sia in grado di soddisfare la tua richiesta).
Non dovresti fidarti $_FILES['upfile']['mime']
, controlla il tipo MIME da solo. A tale scopo, è possibile utilizzare l' fileinfo
estensione , 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.ini
e riavviare il server:
extension=php_fileinfo.dll
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
}
}
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 '.'