2014-10-01 18 views
10

Javascript (Windows 8.1, Firefox) non sembrano avere tipi MIME per i file .tar o file .rar (e forse altri, questi sono gli unici due che ho trovato) . Cosa succede con quello? C'è qualcosa che posso usare per risolvere questo? Mi piacerebbe davvero essere in grado di recuperare i tipi mime per questi tipi di file senza fare un po 'strano hacking delle estensioni.tipo Mime mancante per .rar e .tar

ho fatto un violino per dimostrare il problema: http://jsfiddle.net/kungfujoe/jd8h7wvs/

Se si passa a un file .txt, o un .docx, o di tanti altri formati, il tipo è tirato con successo. Tuttavia, sia .tar che .rar non li tirano. Strano, giusto?

(codice JSFiddle sotto)

HTML

<input id='button' type='file' name='file'/> 
<div id='out'>Output Goes Here</div> 

Javascript (utilizzando jQuery 2.1.0)

$('#button').unbind('change'); 
$('#button').bind('change', function() { 
    if(this.files[0] !== undefined && this.files[0] !== null) { 
     document.getElementById("out").innerHTML = "Type is " + this.files[0].type.toString();   
    } else { 
     throw "Error" 
    } 
}); 

Grazie

EDIT

1) Domanda aggiornata per riflettere che il problema è stato riscontrato su Windows 8.1 Firefox. Chrome ha un tipo mime per i file tar, ma non per i file rar.

2) Aggiunto jQuery per il violino

+2

Non hai aggiunto jQuery al tuo violino. Confermato di non lavorare con i file tar. – DanFromGermany

+1

In quale sistema operativo ci si trova? Potrebbe essere che il browser stia delegando al sistema operativo per risolvere il tipo mime, o non vi è alcuna associazione nella configurazione del browser tra quella estensione di file e il suo tipo mime. Cercando di configurare il tuo browser per sapere quale programma esterno dovrebbe aprire .tar o .rar. Forse questo ti aiuterà? –

+1

Va bene per rar e tar, restituisce: Type è application/x-rar (o x-tar) su MacOs/Chrome. Su quale SO/browser lo stai testando? – enguerranws

risposta

11

JQuery appena avvolge l'API File sottostante utilizzato nella maggior parte dei browser, quindi non c'è alcuna differenza come JQuery e Javascript gestire i file ei tipi MIME. Ecco le specifiche API File:

http://www.w3.org/TR/FileAPI/#dfn-type

L'oggetto File che si stanno manipolando eredita il tipo proprietà dall'oggetto Blob, e il browser utilizza il blob (matrice di byte) per determinare il tipo MIME.

Per eseguire questa operazione, ciascun browser implementa un algoritmo di sniffing dei file per "leggere" il tipo MIME dall'array di byte e, se il tipo mime non corrisponde, restituirà una stringa vuota come nel proprio scenario sopra.

Ecco tutte le specifiche algoritmo:

https://mimesniff.spec.whatwg.org/

Così ora vi state chiedendo il motivo per cui non funziona per i file RAR TAR, ZIP e, e perché funziona per alcune persone e non per tu? .. perché l'algoritmo di sniffing dei file non è evidentemente perfetto.

Utilizza il modello di byte corrispondente a e non sembra abbastanza affidabile.

Per esempio ho usato WinRaR sul mio Windows 8 box per comprimere un file, ei byte iniziali del file creato sono:

52 61 72 21 1A 07 00

Tuttavia, per riconoscerlo come.RAR l'algoritmo modello del browser di byte corrispondenti aspetta

52 61 72 20 1A 07 00

Come si vede c'è una leggera differenza, e quando ho caricato il mio file RAR al browser di utilizzare il codice di cui sopra, Firefox non era in grado di riconoscere il Mime -Tipo, e ho ottenuto una stringa vuota nella proprietà type.

Tuttavia, quando ho confezionato un file ZIP utilizzando WinRar sulla stessa macchina con le impostazioni predefinite genera una sequenza iniziale array di byte di 50 4B 03 04 che abbinato con il modello di cerniera di byte previsto dall'algoritmo, e quando ho usato il codice di sopra di esso è stato in grado di rilevare il tipo mime correttamente come application/zip!

Come si vede dalla mia spiegazione, si tratta di serializzazione e "imperfezione" dell'algoritmo che corrisponde ai byte serializzati con le estensioni mime nei browser.

Sulla base di tutto quanto sopra menzionato, consiglierei di NON fare affidamento sul mime sniffing, e invece di usare il codice personalizzato per determinare il tipo MIME O le librerie esistenti. È possibile utilizzare un approccio lato server o lato client.

Se si vuole attaccare al cliente si potrebbe usare la seguente libreria JS:

https://github.com/rsdoiel/mimetype-js

E poi scoprire il tipo MIME sarebbe una questione di una riga di codice:

Ecco un violino di lavoro, aggiornare il proprio esempio per utilizzare mimetype JS:

http://jsfiddle.net/jd8h7wvs/4/

+1

Basta aggiungere se non era chiaro: "mimetype.js" è una semplice tabella di ricerca. Funziona in base all'estensione del file e ricerca all'interno di un catalogo il tipo corrispondente. – Academia

+0

Fantastico. Questo e 'esattamente quello che stavo cercando. La taglia è tutta tua (e merita se lo dico anch'io). –

+0

... tra 16 ore (lo aggiungerò alla mia lista di cose da fare) –