Come controllare il contenuto di un file caricato senza fare affidamento sulla sua estensione?

StackOverflow https://stackoverflow.com/questions/245183

  •  05-07-2019
  •  | 
  •  

Domanda

Come si fa a verificare in modo affidabile il tipo di file caricato senza utilizzare l'estensione? Immagino che devi esaminare l'intestazione / leggere alcuni byte, ma non ho davvero idea di come procedere. Sto usando c # e asp.net.

Grazie per qualsiasi consiglio.


ok, quindi dai link sopra ora so che sto cercando 'ff d8 ff e0' per identificare positivamente un file .jpg per esempio.

Nel mio codice posso leggere i primi venti byte senza problemi:

                FileStream fs = File.Open(filePath, FileMode.Open);
                Byte[] b = new byte[20];
                fs.Read(b, 0, 20);

quindi (e scusate la mia totale inesperienza qui) ma come posso verificare se l'array di byte contiene 'ff d8 ff e0'?

È stato utile?

Soluzione

Ecco una risposta rapida e sporca alla domanda di follow-up che hai pubblicato:

byte[] jpg = new byte[] { 0xFF, 0xD8, 0xFF, 0xE0 };
bool match = true;
for (int i = 0; i < jpg.Length; i++)
{
    if (jpg[i] != b[i])
    {
        match = false;
        break;
    }
}

Altri suggerimenti

Questo è esattamente ciò che fa il programma Unix file , con livelli di affidabilità maggiori o minori. In parte, dipende dal fatto che i programmi di cui stai provando a rilevare i file emettano un'intestazione di file; il programma tar è noto per non farlo. Dipende da quanti tipi di file prevedi di provare a riconoscere, ma potrebbe essere più semplice utilizzare un'implementazione di file ; riconosce molti tipi di file e le versioni moderne sono estendibili tramite un file di definizioni di tipi di file aggiuntivi in ??grado di gestire una moltitudine di scenari.

I primi pochi byte di un file indicano spesso il tipo di file. Vedi, ad esempio,
http://www.garykessler.net/library/file_sigs.html
http://www.astro.keele.ac.uk/ oldusers / rno / Computing / File_magic.html

Usa System.IO per leggere i byte come binari dopo il caricamento.

Sono curioso, però, perché non puoi fare affidamento sull'intestazione ContentType?

Wotsit è una buona risorsa per scoprire i numeri magici per vari tipi di file.

La lettura del contenuto del file è un modo infallibile. Dato che lo stai creando in .Net, probabilmente potresti controllare il tipo MIME del file caricato.

Puoi aiutare DllImport urlmon.dll per aiutarti. Si prega di fare riferimento a un post all'indirizzo: http://coding-passion.blogspot.com/2008/ 11 / validazione-file-type.html

E per chiarire riguardo al tipo di contenuto, è inevitabilmente guidato dall'estensione del file. Quindi anche a un file .zip è stata rinominata l'estensione .txt, il tipo di contenuto continuerà a dire solo testo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top