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
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".
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%.
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.
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).
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
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 '.'