2009-12-15 18 views
14

Esiste una funzione incorporata che restituisca il tipo di contenuto in base all'estensione del file?tipo di contenuto per estensione

+3

L'estensione non indica quale sia il tipo di contenuto. Non fare affidamento su di esso. –

+1

Come seguito del commento di Anon: l'estensione è completamente transitoria quindi un file eseguibile (.exe) potrebbe facilmente essere rinominato in uno dei tipi che la tua applicazione si aspetta e la tua applicazione non sarebbe in grado di determinare che il file rinominato è in realtà un po ' altro tipo –

risposta

16

Non che io sappia. Ma è possibile utilizzare questo codice:

using Microsoft.Win32; 

RegistryKey key = Registry.ClassesRoot.OpenSubKey(extension); 
string contentType = key.GetValue("Content Type").ToString(); 

È necessario aggiungere codice aggiuntivo per la gestione degli errori.

Nota: l'estensione deve essere preceduta da un punto, come in .txt.

+2

C'è un modo per andare nella direzione opposta? Dispongo di tipi di contenuto e desidero memorizzare nella cache il contenuto con l'estensione appropriata. – Jordan

+2

@Jordan: ti suggerisco di creare una domanda con questo. La gente risponderà lì. – CesarGon

+0

@cesargon E 'possibile consentire al browser di scaricare qualsiasi file il cui nome e l'estensione siano passati attraverso querystring. Per favore, vedi la mia domanda, se puoi rispondere a questo. http://stackoverflow.com/questions/9927339 –

6

FYKI, controllare il registro in \ HKEY_CLASSES_ROOT \ MIME \ Database \ Tipo contenuto. Ci sarà un elenco di tipo di contenuto ed estensione del file. Se è possibile caricare queste informazioni tramite Windows API, è possibile ottenere l'estensione del file per il mapping del tipo di contenuto.

hth

UPDATE: [fonte] [1]

public string GetMIMEType(string filepath) 
    { 
     FileInfo fileInfo = new FileInfo(filepath); 
     string fileExtension = fileInfo.Extension.ToLower(); 

     // direct mapping which is fast and ensures these extensions are found 
     switch (fileExtension) 
     { 
      case "htm": 
      case "html": 
       return "text/html"; 
      case "js": 
       return "text/javascript"; // registry may return "application/x-javascript" 
     } 



      // see if we can find extension info anywhere in the registry 
    //Note : there is not a ContentType key under ALL the file types , check Run --> regedit , then extensions !!! 

     RegistryPermission regPerm = new RegistryPermission(RegistryPermissionAccess.Read, @"\\HKEY_CLASSES_ROOT"); 

     // looks for extension with a content type 
     RegistryKey rkContentTypes = Registry.ClassesRoot.OpenSubKey(fileExtension); 
     if (rkContentTypes != null) 
     { 
      object key = rkContentTypes.GetValue("Content Type"); 
      if (key != null) 
       return key.ToString().ToLower(); 
     } 


     // looks for a content type with extension 
     // Note : This would be problem if multiple extensions associate with one content type. 
     RegistryKey typeKey = Registry.ClassesRoot.OpenSubKey(@"MIME\Database\Content Type"); 

     foreach (string keyname in typeKey.GetSubKeyNames()) 
     { 
      RegistryKey curKey = typeKey.OpenSubKey(keyname); 
      if (curKey != null) 
      { 
       object extension = curKey.GetValue("Extension"); 
       if (extension != null) 
       { 
        if (extension.ToString().ToLower() == fileExtension) 
        { 
         return keyname; 
        } 
       } 
      } 
     } 

     return null; 
    } 

[1]: http://www.codeproject.com/KB/dotnet/ContentType.aspx?msg=2903389#xx2903389xxenter code here

+0

Penso che mrblah voglia trovare il tipo di contenuto dall'estensione, non il contrario. Guardando nella chiave del registro del database MIME sarebbe utile trovare le estensioni di file per un dato tipo di contenuto. – CesarGon

+0

sì, hai ragione, credo, il tuo metodo cercherà in \ HKEY_CLASSES_ROOT. Ha estensione alla mappatura del tipo di contenuto. utilizzando il mio approccio è possibile ottenere il valore ma sarebbe un problema se più estensioni si associano a un tipo di contenuto. – nayakam

+0

È possibile consentire al browser di scaricare qualsiasi file il cui nome e l'estensione siano passati attraverso querystring. Per favore, vedi la mia domanda, se puoi rispondere a questo. http://stackoverflow.com/questions/9927339 –

0

Ecco quello che ho scritto:

public string GetContentTypeByExtension(string strExtension) 
{ 
    switch (strExtension) 
    { 
     case ".fif": 

      return "application/fractals"; 
      break; 

     case ".hta": 

      return "application/hta"; 
      break; 

     case ".hqx": 

      return "application/mac-binhex40"; 
      break; 

     case ".vsi": 

      return "application/ms-vsi"; 
      break; 

     case ".p10": 

      return "application/pkcs10"; 
      break; 

     case ".p7m": 

      return "application/pkcs7-mime"; 
      break; 

     case ".p7s": 

      return "application/pkcs7-signature"; 
      break; 

     case ".cer": 

      return "application/pkix-cert"; 
      break; 

     case ".crl": 

      return "application/pkix-crl"; 
      break; 

     case ".ps": 

      return "application/postscript"; 
      break; 

     case ".setpay": 

      return "application/set-payment-initiation"; 
      break; 

     case ".setreg": 

      return "application/set-registration-initiation"; 
      break; 

     case ".sst": 

      return "application/vnd.ms-pki.certstore"; 
      break; 

     case ".pko": 

      return "application/vnd.ms-pki.pko"; 
      break; 

     case ".cat": 

      return "application/vnd.ms-pki.seccat"; 
      break; 

     case ".stl": 

      return "application/vnd.ms-pki.stl"; 
      break; 

     case ".wpl": 

      return "application/vnd.ms-wpl"; 
      break; 

     case ".xps": 

      return "application/vnd.ms-xpsdocument"; 
      break; 

     case ".z": 

      return "application/x-compress"; 
      break; 

     case ".tgz": 

      return "application/x-compressed"; 
      break; 

     case ".gz": 

      return "application/x-gzip"; 
      break; 

     case ".ins": 

      return "application/x-internet-signup"; 
      break; 

     case ".iii": 

      return "application/x-iphone"; 
      break; 

     case ".jtx": 

      return "application/x-jtx+xps"; 
      break; 

     case ".latex": 

      return "application/x-latex"; 
      break; 

     case ".nix": 

      return "application/x-mix-transfer"; 
      break; 

     case ".asx": 

      return "application/x-mplayer2"; 
      break; 

     case ".application": 

      return "application/x-ms-application"; 
      break; 

     case ".wmd": 

      return "application/x-ms-wmd"; 
      break; 

     case ".wmz": 

      return "application/x-ms-wmz"; 
      break; 

     case ".xbap": 

      return "application/x-ms-xbap"; 
      break; 

     case ".p12": 

      return "application/x-pkcs12"; 
      break; 

     case ".p7b": 

      return "application/x-pkcs7-certificates"; 
      break; 

     case ".p7r": 

      return "application/x-pkcs7-certreqresp"; 
      break; 

     case ".sit": 

      return "application/x-stuffit"; 
      break; 

     case ".tar": 

      return "application/x-tar"; 
      break; 

     case ".man": 

      return "application/x-troff-man"; 
      break; 

     case ".cer": 

      return "application/x-x509-ca-cert"; 
      break; 

     case ".zip": 

      return "application/x-zip-compressed"; 
      break; 

     case ".xaml": 

      return "application/xaml+xml"; 
      break; 

     case ".xml": 

      return "application/xml"; 
      break; 

     case ".aiff": 

      return "audio/aiff"; 
      break; 

     case ".au": 

      return "audio/basic"; 
      break; 

     case ".mid": 

      return "audio/mid"; 
      break; 

     case ".mid": 

      return "audio/midi"; 
      break; 

     case ".mp3": 

      return "audio/mp3"; 
      break; 

     case ".mp3": 

      return "audio/mpeg"; 
      break; 

     case ".m3u": 

      return "audio/mpegurl"; 
      break; 

     case ".mp3": 

      return "audio/mpg"; 
      break; 

     case ".wav": 

      return "audio/wav"; 
      break; 

     case ".aiff": 

      return "audio/x-aiff"; 
      break; 

     case ".mid": 

      return "audio/x-mid"; 
      break; 

     case ".mid": 

      return "audio/x-midi"; 
      break; 

     case ".mp3": 

      return "audio/x-mp3"; 
      break; 

     case ".mp3": 

      return "audio/x-mpeg"; 
      break; 

     case ".m3u": 

      return "audio/x-mpegurl"; 
      break; 

     case ".mp3": 

      return "audio/x-mpg"; 
      break; 

     case ".wax": 

      return "audio/x-ms-wax"; 
      break; 

     case ".wma": 

      return "audio/x-ms-wma"; 
      break; 

     case ".wav": 

      return "audio/x-wav"; 
      break; 

     case ".bmp": 

      return "image/bmp"; 
      break; 

     case ".gif": 

      return "image/gif"; 
      break; 

     case ".jpg": 

      return "image/jpeg"; 
      break; 

     case ".jpg": 

      return "image/pjpeg"; 
      break; 

     case ".png": 

      return "image/png"; 
      break; 

     case ".tiff": 

      return "image/tiff"; 
      break; 

     case ".ico": 

      return "image/x-icon"; 
      break; 

     case ".png": 

      return "image/x-png"; 
      break; 

     case ".mid": 

      return "midi/mid"; 
      break; 

     case ".dwfx": 

      return "model/vnd.dwfx+xps"; 
      break; 

     case ".css": 

      return "text/css"; 
      break; 

     case ".323": 

      return "text/h323"; 
      break; 

     case ".htm": 

      return "text/html"; 
      break; 

     case ".uls": 

      return "text/iuls"; 
      break; 

     case ".txt": 

      return "text/plain"; 
      break; 

     case ".wsc": 

      return "text/scriptlet"; 
      break; 

     case ".htt": 

      return "text/webviewhtml"; 
      break; 

     case ".htc": 

      return "text/x-component"; 
      break; 

     case ".vcf": 

      return "text/x-vcard"; 
      break; 

     case ".xml": 

      return "text/xml"; 
      break; 

     case ".avi": 

      return "video/avi"; 
      break; 

     case ".mpeg": 

      return "video/mpeg"; 
      break; 

     case ".mpeg": 

      return "video/mpg"; 
      break; 

     case ".avi": 

      return "video/msvideo"; 
      break; 

     case ".mpeg": 

      return "video/x-mpeg"; 
      break; 

     case ".mpeg": 

      return "video/x-mpeg2a"; 
      break; 

     case ".asx": 

      return "video/x-ms-asf"; 
      break; 

     case ".asx": 

      return "video/x-ms-asf-plugin"; 
      break; 

     case ".wm": 

      return "video/x-ms-wm"; 
      break; 

     case ".wmv": 

      return "video/x-ms-wmv"; 
      break; 

     case ".wmx": 

      return "video/x-ms-wmx"; 
      break; 

     case ".wvx": 

      return "video/x-ms-wvx"; 
      break; 

     case ".avi": 

      return "video/x-msvideo"; 
      break; 


    } 


} 
+1

Hai dichiarazioni di casi duplicati –

1

Se si tratta di un file caricato. È possibile memorizzare il tipo di contenuto in una colonna del database per un uso successivo quando si carica il file. Esiste una proprietà denominata ContentType per la classe HttpPostedFile.

0

Per un elenco più o meno completa controllare la mappa in basso (C++, ma è semplice per cambiarlo in C#).

Questo è il modo in cui Google/Chrome riconosce l'estensione del file del tipo di contenuto (non so come viene generato il corpo dell'e-mail - da JavaScript sul lato client o da POST sul lato server - la mia ipotesi è quest'ultima). Ho ottenuto questo elenco utilizzando il seguente trucco:

  1. Ha cercato estensioni di file più comunemente utilizzate su Internet. Ho avuto la fortuna di trovare una tabella html in modo da poterla copiare e incollare in Excel per ottenere una lista pulita delle estensioni.

  2. Creato un file piccolo test con alcuni caratteri del contenuto.

  3. usato la lista di estensioni in (2) e qualche riga di comando magia per creare file TEST.TXT, Test.htm, test.TIFF e così via. La variante di Linux è for file in test.TXT test.HTM test.TIFF ... ; do cp test "$file"; done;

  4. Invia tutti questi file alla mia gmail come allegati. Si noti che alcuni file come .exe e .zip sono stati filtrati per motivi di sicurezza. Mancano nel codice qui sotto!

  5. In gmail, scaricato l'originale, è possibile vedere le righe Content-Type: application/pdf; name="example.pdf" per ciascuno dei file allegati. Analizzato quello in VIM per ottenere la lista qui sotto.

Se si desidera aggiungere un'estensione che non è nella lista qui sotto - Creare una mini sample.xyz, inviare a voi stessi e guardare le e-mail prima per Content-Type. Questo è il trucco. Spero che sia d'aiuto!

P.S. So che non è la lista migliore ma è stato sufficiente per me imparare come inviare gli allegati di posta elettronica al livello di programmazione e scegliere Content-Type per estensione del file come farebbe con gmail. Non essere duro se alcuni tipi di estensione sono "mancanti".

static const map<string, string> ContentTypes = { 
     { "TXT","text/plain" }, 
     { "HTM","text/html" }, 
     { "TIFF","image/tiff" }, 
     { "TMP","application/octet-stream" }, 
     { "TOAST","application/octet-stream" }, 
     { "TORRENT","application/x-bittorrent" }, 
     { "TTF","application/x-font-ttf" }, 
     { "UUE","application/octet-stream" }, 
     { "VCD","application/x-cdlink" }, 
     { "VCF","text/x-vcard" }, 
     { "VCXPROJ","application/xml" }, 
     { "VOB","application/octet-stream" }, 
     { "WAV","audio/x-wav" }, 
     { "WMA","audio/x-ms-wma" }, 
     { "WMV","video/x-ms-wmv" }, 
     { "WPD","application/wordperfect" }, 
     { "WPS","application/octet-stream" }, 
     { "XCODEPROJ","application/octet-stream" }, 
     { "XHTML","application/xhtml+xml" }, 
     { "XLR","application/octet-stream" }, 
     { "XLS","application/vnd.ms-excel" }, 
     { "XLSX","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" }, 
     { "XML","text/xml" }, 
     { "YUV","application/octet-stream" }, 
     { "ZIPX","application/octet-stream" }, 
     { "3DM","application/octet-stream" }, 
     { "3DS","application/octet-stream" }, 
     { "3G2","video/3gpp2" }, 
     { "3GP","video/3gpp" }, 
     { "ACCDB","application/octet-stream" }, 
     { "AI","application/illustrator" }, 
     { "AIF","audio/x-aiff" }, 
     { "APK","application/vnd.android.package-archive" }, 
     { "APP","application/octet-stream" }, 
     { "ASF","video/x-ms-asf" }, 
     { "ASP","application/octet-stream" }, 
     { "ASPX","application/xml" }, 
     { "AVI","video/x-msvideo" }, 
     { "BAK","application/octet-stream" }, 
     { "BIN","application/octet-stream" }, 
     { "BMP","image/bmp" }, 
     { "C","text/x-csrc" }, 
     { "CAB","application/octet-stream" }, 
     { "CBR","application/octet-stream" }, 
     { "CER","application/x-x509-ca-cert" }, 
     { "CFG","application/octet-stream" }, 
     { "CFM","application/octet-stream" }, 
     { "CGI","application/octet-stream" }, 
     { "CLASS","application/octet-stream" }, 
     { "CPP","text/x-c++src" }, 
     { "CRDOWNLOAD","application/octet-stream" }, 
     { "CRX","application/x-chrome-extension" }, 
     { "CS","text/plain" }, 
     { "CSR","application/octet-stream" }, 
     { "CSS","text/css" }, 
     { "CSV","text/csv" }, 
     { "CUE","application/octet-stream" }, 
     { "CUR","application/octet-stream" }, 
     { "DAT","application/octet-stream" }, 
     { "DB","application/octet-stream" }, 
     { "DBF","application/octet-stream" }, 
     { "DDS","image/vnd.ms-dds" }, 
     { "DEB","application/x-debian-package" }, 
     { "DEM","application/octet-stream" }, 
     { "DESKTHEMEPACK","application/octet-stream" }, 
     { "DLL","application/octet-stream" }, 
     { "DMG","application/octet-stream" }, 
     { "DMP","application/octet-stream" }, 
     { "DOC","application/msword" }, 
     { "DOCX","application/vnd.openxmlformats-officedocument.wordprocessingml.document" }, 
     { "DRV","application/octet-stream" }, 
     { "DTD","application/xml-dtd" }, 
     { "DWG","application/octet-stream" }, 
     { "DXF","application/dxf" }, 
     { "EPS","application/postscript" }, 
     { "FLA","application/octet-stream" }, 
     { "FLV","video/x-flv" }, 
     { "FNT","application/octet-stream+fnt" }, 
     { "FON","application/octet-stream+fon" }, 
     { "GADGET","application/octet-stream" }, 
     { "GAM","application/octet-stream" }, 
     { "GED","application/octet-stream" }, 
     { "GIF","image/gif" }, 
     { "GPX","application/gpx+xml" }, 
     { "GZ","application/x-gzip" }, 
     { "H","text/x-chdr" }, 
     { "HQX","application/mac-binhex40" }, 
     { "HTML","text/html" }, 
     { "ICNS","application/octet-stream" }, 
     { "ICO","image/x-icon" }, 
     { "ICS","text/calendar" }, 
     { "IFF","application/octet-stream" }, 
     { "INDD","application/octet-stream" }, 
     { "INI","application/octet-stream" }, 
     { "ISO","application/octet-stream" }, 
     { "JAVA","application/octet-stream" }, 
     { "JPG","image/jpeg" }, 
     { "JSP","application/octet-stream" }, 
     { "KEY","application/octet-stream" }, 
     { "KEYCHAIN","application/octet-stream" }, 
     { "KML","application/vnd.google-earth.kml+xml" }, 
     { "KMZ","application/vnd.google-earth.kmz" }, 
     { "LOG","application/octet-stream" }, 
     { "LUA","application/octet-stream" }, 
     { "M","application/octet-stream" }, 
     { "M3U","audio/x-mpegurl" }, 
     { "M4A","audio/mp4" }, 
     { "M4V","video/x-m4v" }, 
     { "MAX","application/octet-stream" }, 
     { "MDB","application/octet-stream" }, 
     { "MDF","application/octet-stream" }, 
     { "MID","audio/midi" }, 
     { "MIM","application/octet-stream" }, 
     { "MOV","video/quicktime" }, 
     { "MP3","audio/mpeg" }, 
     { "MP4","video/mp4" }, 
     { "MPA","audio/mpeg" }, 
     { "MPG","video/mpeg" }, 
     { "MSG","application/octet-stream" }, 
     { "NES","application/octet-stream" }, 
     { "OBJ","application/octet-stream" }, 
     { "ODT","application/vnd.oasis.opendocument.text" }, 
     { "OTF","application/vnd.oasis.opendocument.formula-template" }, 
     { "PAGES","application/x-iwork-pages-sffpages" }, 
     { "PART","application/octet-stream" }, 
     { "PCT","application/octet-stream" }, 
     { "PDB","chemical/x-pdb" }, 
     { "PDF","application/pdf" }, 
     { "PHP","application/x-httpd-php" }, 
     { "PKG","application/octet-stream" }, 
     { "PL","application/octet-stream" }, 
     { "PLUGIN","application/octet-stream" }, 
     { "PNG","image/png" }, 
     { "PPS","application/vnd.ms-powerpoint" }, 
     { "PPT","application/vnd.ms-powerpoint" }, 
     { "PPTX","application/vnd.openxmlformats-officedocument.presentationml.presentation" }, 
     { "PRF","application/pics-rules" }, 
     { "PS","application/postscript" }, 
     { "PSD","application/photoshop" }, 
     { "PSPIMAGE","application/octet-stream" }, 
     { "PY","application/octet-stream" }, 
     { "RM","audio/x-pn-realaudio" }, 
     { "ROM","application/octet-stream" }, 
     { "RPM","application/x-rpm" }, 
     { "RSS","application/octet-stream" }, 
     { "RTF","application/rtf" }, 
     { "SAV","application/octet-stream" }, 
     { "SDF","application/octet-stream" }, 
     { "SH","application/x-sh" }, 
     { "SITX","application/octet-stream" }, 
     { "SLN","text/plain" }, 
     { "SQL","application/octet-stream" }, 
     { "SRT","application/octet-stream" }, 
     { "SVG","image/svg+xml" }, 
     { "SWF","application/x-shockwave-flash" }, 
     { "SWIFT","application/octet-stream" }, 
     { "TAX2016","application/octet-stream" }, 
     { "TEX","application/x-tex" } 
    }; 
Problemi correlati