.NET의 파일 확장명 및 MIME 유형
지정된 확장명에서 MIME Content-Type을 가져오려고 합니다(물리적 파일에 액세스하지 않는 것이 좋습니다).이에 대한 몇 가지 질문을 보았는데, 이를 수행하기 위해 설명된 방법은 다음에서 다시 시작할 수 있습니다.
- 레지스트리 정보를 사용합니다.
- urlmon.dll의 FindMimeFromData를 사용합니다.
- IIS 정보를 사용합니다.
- 자신만의 MIME 매핑 기능을 롤합니다.예를 들어, 이 표를 기준으로 합니다.
제가 1번을 사용한 지 얼마 되지 않았지만 레지스트리에서 제공하는 정보가 일관성이 없고 기계에 설치된 소프트웨어에 따라 다르다는 것을 깨달았습니다..zip과 같은 일부 확장자는 내용 유형을 지정하는 데 사용하지 않습니다.
솔루션 2번은 첫 번째 바이트를 읽기 위해 디스크에 파일을 저장하도록 강제합니다. 이는 다소 느리지만 좋은 결과를 얻을 수 있습니다.
세 번째 방법은 디렉터리 서비스 및 기타 모든 것을 기반으로 합니다. 이는 COM 참조를 추가해야 하고 IIS6과 IIS7 간에 일치하는지 확신할 수 없기 때문에 별로 좋아하지 않습니다.또한 저는 이 방법의 성능을 모릅니다.
마지막으로, 저는 제 테이블을 사용하고 싶지 않았지만 플랫폼 간(Mono에서도) 적절한 성능과 일관성을 원하는 경우 가장 좋은 옵션으로 보입니다.
제 테이블을 사용하는 것보다 더 나은 선택지가 있다고 생각하십니까, 아니면 설명된 다른 방법 중 하나가 더 낫다고 생각하십니까?당신의 경험은 무엇입니까?
MIME 유형이 필요한 대상에 따라 다릅니다.일반적으로 서비스(웹 앱, 웹 서비스 등)의 경우 OS 설정에 종속된 MIME 목록을 사용하지 않는 것이 좋습니다. 그렇지 않으면 MIME 정보를 찾을 수 없는 경우에만 예비 목록으로 사용하는 것이 좋습니다.
저는 가 그들의 MIME 유형을 의 MIME 것을 이기도 하다고 합니다.System.Web.MimeMapping
클래스(어떤 이유로든 내부적인 것임).
편집:
래퍼(<= .NET 3.5)
public static class MimeExtensionHelper
{
static object locker = new object();
static object mimeMapping;
static MethodInfo getMimeMappingMethodInfo;
static MimeExtensionHelper()
{
Type mimeMappingType = Assembly.GetAssembly(typeof(HttpRuntime)).GetType("System.Web.MimeMapping");
if (mimeMappingType == null)
throw new SystemException("Couldnt find MimeMapping type");
ConstructorInfo constructorInfo = mimeMappingType.GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance, null, Type.EmptyTypes, null);
if (constructorInfo == null)
throw new SystemException("Couldnt find default constructor for MimeMapping");
mimeMapping = constructorInfo.Invoke(null);
if (mimeMapping == null)
throw new SystemException("Couldnt find MimeMapping");
getMimeMappingMethodInfo = mimeMappingType.GetMethod("GetMimeMapping", BindingFlags.Static | BindingFlags.NonPublic);
if (getMimeMappingMethodInfo == null)
throw new SystemException("Couldnt find GetMimeMapping method");
if (getMimeMappingMethodInfo.ReturnType != typeof(string))
throw new SystemException("GetMimeMapping method has invalid return type");
if (getMimeMappingMethodInfo.GetParameters().Length != 1 && getMimeMappingMethodInfo.GetParameters()[0].ParameterType != typeof(string))
throw new SystemException("GetMimeMapping method has invalid parameters");
}
public static string GetMimeType(string filename)
{
lock (locker)
return (string)getMimeMappingMethodInfo.Invoke(mimeMapping, new object[] { filename });
}
}
포장지(.)NET 4.0)
public static class MimeExtensionHelper
{
static object locker = new object();
static object mimeMapping;
static MethodInfo getMimeMappingMethodInfo;
static MimeExtensionHelper()
{
Type mimeMappingType = Assembly.GetAssembly(typeof(HttpRuntime)).GetType("System.Web.MimeMapping");
if (mimeMappingType == null)
throw new SystemException("Couldnt find MimeMapping type");
getMimeMappingMethodInfo = mimeMappingType.GetMethod("GetMimeMapping", BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public);
if (getMimeMappingMethodInfo == null)
throw new SystemException("Couldnt find GetMimeMapping method");
if (getMimeMappingMethodInfo.ReturnType != typeof(string))
throw new SystemException("GetMimeMapping method has invalid return type");
if (getMimeMappingMethodInfo.GetParameters().Length != 1 && getMimeMappingMethodInfo.GetParameters()[0].ParameterType != typeof(string))
throw new SystemException("GetMimeMapping method has invalid parameters");
}
public static string GetMimeType(string filename)
{
lock (locker)
return (string)getMimeMappingMethodInfo.Invoke(mimeMapping, new object[] { filename });
}
}
.NET 4.5+
래퍼가 필요하지 않습니다. 공용 메소드를 직접 호출하십시오.
나는 아마도 3번을 제외하고 유틸리티 lib에서 이 모든 접근법을 결합했습니다.Btw, no.2(urlmon.dll)는 정적 파일을 필요로 하지 않으며, 어디서 왔는지에 관계없이 일부 바이트만 소요됩니다.현재 수업은 여기 있습니다.
namespace Components
{
using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.InteropServices;
using System.Text;
using System.Xml.Serialization;
using Microsoft.Win32;
public sealed class MimeExtensionHelper
{
private MimeExtensionHelper() { }
/// <summary>Finds extension associated with specified mime type</summary>
/// <param name="mimeType">mime type you search extension for, e.g.: "application/octet-stream"</param>
/// <returns>most used extension, associated with provided type, e.g.: ".bin"</returns>
public static string FindExtension(string mimeType)
{
return ExtensionTypes.GetExtension(mimeType);
}
/// <summary>Finds mime type using provided extension and/or file's binary content.</summary>
/// <param name="file">Full file path</param>
/// <param name="verifyFromContent">Should the file's content be examined to verify founded value.</param>
/// <returns>mime type of file, e.g.: "application/octet-stream"</returns>
public static string FindMime(string file,bool verifyFromContent)
{
string extension = Path.GetExtension(file);
string mimeType = string.Empty;
try
{
if (!String.IsNullOrEmpty(extension))
mimeType = ExtensionTypes.GetMimeType(extension);
if (verifyFromContent
|| (String.IsNullOrEmpty(mimeType) && File.Exists(file)))
mimeType = FindMimeByContent(file,mimeType);
}
catch { }
return (mimeType ?? string.Empty).Trim();//"application/octet-stream"
}
/// <summary>Finds mime type for file using it's binary data.</summary>
/// <param name="file">Full path to file.</param>
/// <param name="proposedType">Optional. Expected file's type.</param>
/// <returns>mime type, e.g.: "application/octet-stream"</returns>
public static string FindMimeByContent(string file
,string proposedType)
{
FileInfo fi = new FileInfo(file);
if (!fi.Exists)
throw new FileNotFoundException(file);
byte[] buf = new byte[Math.Min(4096L,fi.Length)];
using (FileStream fs = File.OpenRead(file))
fs.Read(buf,0,buf.Length);
return FindMimeByData(buf,proposedType);
}
/// <summary>Finds mime type for binary data.</summary>
/// <param name="dataBytes">Binary data to examine.</param>
/// <param name="mimeProposed">Optional. Expected mime type.</param>
/// <returns>mime type, e.g.: "application/octet-stream"</returns>
public static string FindMimeByData(byte[] dataBytes,string mimeProposed)
{
if (dataBytes == null || dataBytes.Length == 0)
throw new ArgumentNullException("dataBytes");
string mimeRet = String.Empty;
IntPtr outPtr = IntPtr.Zero;
if (!String.IsNullOrEmpty(mimeProposed))
mimeRet = mimeProposed;
int result = FindMimeFromData(IntPtr.Zero
,null
,dataBytes
,dataBytes.Length
,String.IsNullOrEmpty(mimeProposed) ? null : mimeProposed
,0
,out outPtr
,0);
if (result != 0)
throw Marshal.GetExceptionForHR(result);
if (outPtr != null && outPtr != IntPtr.Zero)
{
mimeRet = Marshal.PtrToStringUni(outPtr);
Marshal.FreeCoTaskMem(outPtr);
}
return mimeRet;
}
[DllImport("urlmon.dll"
,CharSet = CharSet.Unicode
,ExactSpelling = true
,SetLastError = true)]
static extern Int32 FindMimeFromData(IntPtr pBC
,[MarshalAs(UnmanagedType.LPWStr)] String pwzUrl
,[MarshalAs(UnmanagedType.LPArray,ArraySubType = UnmanagedType.I1,SizeParamIndex = 3)] Byte[] pBuffer
,Int32 cbSize
,[MarshalAs(UnmanagedType.LPWStr)] String pwzMimeProposed
,Int32 dwMimeFlags
,out IntPtr ppwzMimeOut
,Int32 dwReserved);
private static MimeTypeCollection _extensionTypes = null;
private static MimeTypeCollection ExtensionTypes
{
get
{
if (_extensionTypes == null)
_extensionTypes = new MimeTypeCollection();
return _extensionTypes;
}
}
[Serializable]
[XmlRoot(ElementName = "mimeTypes")]
private class MimeTypeCollection : List<MimeTypeCollection.mimeTypeInfo>
{
private SortedList<string,string> _extensions;
private SortedList<string,List<string>> _mimes;
private void Init()
{
if (_extensions == null || _mimes == null
|| _extensions.Count == 0 || _mimes.Count == 0)
{
_extensions = new SortedList<string,string>(StringComparer.OrdinalIgnoreCase);
_mimes = new SortedList<string,List<string>>(StringComparer.OrdinalIgnoreCase);
foreach (var mime in this)
{
_mimes.Add(mime.MimeType,new List<string>(mime.Extensions));
foreach (string ext in mime.Extensions)
if (!_extensions.ContainsKey(ext))
_extensions.Add(ext,mime.MimeType);
}
}
}
public String GetExtension(string type)
{
Init();
return _mimes.ContainsKey(type) ? _mimes[type][0] : string.Empty;
}
public String GetMimeType(string extension)
{
Init();
return _extensions.ContainsKey(extension) ? _extensions[extension] : string.Empty;
}
public MimeTypeCollection()
{
this.Add(new mimeTypeInfo("application/applixware",new List<string>(new[] { ".aw" })));
this.Add(new mimeTypeInfo("application/atom+xml",new List<string>(new[] { ".atom" })));
// ... Whole list from apache's site
this.Add(new mimeTypeInfo("x-x509-ca-cert",new List<string>(new[] { ".cer" })));
try
{
using (RegistryKey classesRoot = Registry.ClassesRoot)
using (RegistryKey typeKey = classesRoot.OpenSubKey(@"MIME\Database\Content Type"))
{
string[] subKeyNames = typeKey.GetSubKeyNames();
string extension = string.Empty;
foreach (string keyname in subKeyNames)
{
string trimmed = (keyname ?? string.Empty).Trim();
if (string.IsNullOrEmpty(trimmed))
continue;
if (!String.IsNullOrEmpty(GetExtension(trimmed)))
continue;
string subKey = "MIME\\Database\\Content Type\\" + trimmed;
using (RegistryKey curKey = classesRoot.OpenSubKey(subKey))
{
extension = (curKey.GetValue("Extension") as string ?? string.Empty).Trim();
if (extension.Length > 0)
this.Add(new mimeTypeInfo(trimmed
,new List<string>(new[] { extension })));
}
}
}
}
catch (Exception ex)
{
string s = ex.ToString();
}
}
[Serializable]
public class mimeTypeInfo
{
[XmlAttribute(AttributeName = "mimeType")]
public String MimeType { get; set; }
[XmlElement("extension")]
public List<String> Extensions { get; set; }
public mimeTypeInfo(string mimeType,List<string> extensions)
{
MimeType = mimeType;
Extensions = extensions;
}
public mimeTypeInfo() { }
}
}
}
}
그System.Web.MimeMapping
에는 두 가지 버전 4.0(여기서 두 가지 버전 중 하나는 내부 버전)과 두 가지 버전 2.0(내부 버전)이 있습니다.지적한 것처럼, 시스템에는 공개 버전의 클래스가 있습니다..vmdk 웹 4.NET 4.5 프레임워크.
RoadkillWiki의 경우 매번 반영하는 수고를 덜기 위해 기본적으로 리버스 엔지니어링했습니다. Wiki의 파일 처리기는 기본적으로 IIS/applicationhost.config를 사용하려고 시도한 다음 MimeMapping 클래스로 넘어갑니다.
private string GetMimeType(string fileExtension, ServerManager serverManager)
{
try
{
string mimeType = "text/plain";
Microsoft.Web.Administration.Configuration config = serverManager.GetApplicationHostConfiguration();
ConfigurationSection staticContentSection = config.GetSection("system.webServer/staticContent");
ConfigurationElementCollection mimemaps = staticContentSection.GetCollection();
ConfigurationElement element = mimemaps.FirstOrDefault(m => m.Attributes["fileExtension"].Value.ToString() == fileExtension);
if (element != null)
mimeType = element.Attributes["mimeType"].Value.ToString();
return mimeType;
}
catch (UnauthorizedAccessException)
{
// Shared hosting won't have access to the applicationhost.config file
return MimeMapping.GetMimeMapping("." +fileExtension);
}
}
MIME 매핑:
public class MimeMapping
{
private static Dictionary<string, string> ExtensionMap = new Dictionary<string, string>();
static MimeMapping()
{
ExtensionMap.Add(".323", "text/h323");
ExtensionMap.Add(".asx", "video/x-ms-asf");
ExtensionMap.Add(".acx", "application/internet-property-stream");
ExtensionMap.Add(".ai", "application/postscript");
ExtensionMap.Add(".aif", "audio/x-aiff");
ExtensionMap.Add(".aiff", "audio/aiff");
ExtensionMap.Add(".axs", "application/olescript");
ExtensionMap.Add(".aifc", "audio/aiff");
ExtensionMap.Add(".asr", "video/x-ms-asf");
ExtensionMap.Add(".avi", "video/x-msvideo");
ExtensionMap.Add(".asf", "video/x-ms-asf");
ExtensionMap.Add(".au", "audio/basic");
ExtensionMap.Add(".application", "application/x-ms-application");
ExtensionMap.Add(".bin", "application/octet-stream");
ExtensionMap.Add(".bas", "text/plain");
ExtensionMap.Add(".bcpio", "application/x-bcpio");
ExtensionMap.Add(".bmp", "image/bmp");
ExtensionMap.Add(".cdf", "application/x-cdf");
ExtensionMap.Add(".cat", "application/vndms-pkiseccat");
ExtensionMap.Add(".crt", "application/x-x509-ca-cert");
ExtensionMap.Add(".c", "text/plain");
ExtensionMap.Add(".css", "text/css");
ExtensionMap.Add(".cer", "application/x-x509-ca-cert");
ExtensionMap.Add(".crl", "application/pkix-crl");
ExtensionMap.Add(".cmx", "image/x-cmx");
ExtensionMap.Add(".csh", "application/x-csh");
ExtensionMap.Add(".cod", "image/cis-cod");
ExtensionMap.Add(".cpio", "application/x-cpio");
ExtensionMap.Add(".clp", "application/x-msclip");
ExtensionMap.Add(".crd", "application/x-mscardfile");
ExtensionMap.Add(".deploy", "application/octet-stream");
ExtensionMap.Add(".dll", "application/x-msdownload");
ExtensionMap.Add(".dot", "application/msword");
ExtensionMap.Add(".doc", "application/msword");
ExtensionMap.Add(".dvi", "application/x-dvi");
ExtensionMap.Add(".dir", "application/x-director");
ExtensionMap.Add(".dxr", "application/x-director");
ExtensionMap.Add(".der", "application/x-x509-ca-cert");
ExtensionMap.Add(".dib", "image/bmp");
ExtensionMap.Add(".dcr", "application/x-director");
ExtensionMap.Add(".disco", "text/xml");
ExtensionMap.Add(".exe", "application/octet-stream");
ExtensionMap.Add(".etx", "text/x-setext");
ExtensionMap.Add(".evy", "application/envoy");
ExtensionMap.Add(".eml", "message/rfc822");
ExtensionMap.Add(".eps", "application/postscript");
ExtensionMap.Add(".flr", "x-world/x-vrml");
ExtensionMap.Add(".fif", "application/fractals");
ExtensionMap.Add(".gtar", "application/x-gtar");
ExtensionMap.Add(".gif", "image/gif");
ExtensionMap.Add(".gz", "application/x-gzip");
ExtensionMap.Add(".hta", "application/hta");
ExtensionMap.Add(".htc", "text/x-component");
ExtensionMap.Add(".htt", "text/webviewhtml");
ExtensionMap.Add(".h", "text/plain");
ExtensionMap.Add(".hdf", "application/x-hdf");
ExtensionMap.Add(".hlp", "application/winhlp");
ExtensionMap.Add(".html", "text/html");
ExtensionMap.Add(".htm", "text/html");
ExtensionMap.Add(".hqx", "application/mac-binhex40");
ExtensionMap.Add(".isp", "application/x-internet-signup");
ExtensionMap.Add(".iii", "application/x-iphone");
ExtensionMap.Add(".ief", "image/ief");
ExtensionMap.Add(".ivf", "video/x-ivf");
ExtensionMap.Add(".ins", "application/x-internet-signup");
ExtensionMap.Add(".ico", "image/x-icon");
ExtensionMap.Add(".jpg", "image/jpeg");
ExtensionMap.Add(".jfif", "image/pjpeg");
ExtensionMap.Add(".jpe", "image/jpeg");
ExtensionMap.Add(".jpeg", "image/jpeg");
ExtensionMap.Add(".js", "application/x-javascript");
ExtensionMap.Add(".lsx", "video/x-la-asf");
ExtensionMap.Add(".latex", "application/x-latex");
ExtensionMap.Add(".lsf", "video/x-la-asf");
ExtensionMap.Add(".manifest", "application/x-ms-manifest");
ExtensionMap.Add(".mhtml", "message/rfc822");
ExtensionMap.Add(".mny", "application/x-msmoney");
ExtensionMap.Add(".mht", "message/rfc822");
ExtensionMap.Add(".mid", "audio/mid");
ExtensionMap.Add(".mpv2", "video/mpeg");
ExtensionMap.Add(".man", "application/x-troff-man");
ExtensionMap.Add(".mvb", "application/x-msmediaview");
ExtensionMap.Add(".mpeg", "video/mpeg");
ExtensionMap.Add(".m3u", "audio/x-mpegurl");
ExtensionMap.Add(".mdb", "application/x-msaccess");
ExtensionMap.Add(".mpp", "application/vnd.ms-project");
ExtensionMap.Add(".m1v", "video/mpeg");
ExtensionMap.Add(".mpa", "video/mpeg");
ExtensionMap.Add(".me", "application/x-troff-me");
ExtensionMap.Add(".m13", "application/x-msmediaview");
ExtensionMap.Add(".movie", "video/x-sgi-movie");
ExtensionMap.Add(".m14", "application/x-msmediaview");
ExtensionMap.Add(".mpe", "video/mpeg");
ExtensionMap.Add(".mp2", "video/mpeg");
ExtensionMap.Add(".mov", "video/quicktime");
ExtensionMap.Add(".mp3", "audio/mpeg");
ExtensionMap.Add(".mpg", "video/mpeg");
ExtensionMap.Add(".ms", "application/x-troff-ms");
ExtensionMap.Add(".nc", "application/x-netcdf");
ExtensionMap.Add(".nws", "message/rfc822");
ExtensionMap.Add(".oda", "application/oda");
ExtensionMap.Add(".ods", "application/oleobject");
ExtensionMap.Add(".pmc", "application/x-perfmon");
ExtensionMap.Add(".p7r", "application/x-pkcs7-certreqresp");
ExtensionMap.Add(".p7b", "application/x-pkcs7-certificates");
ExtensionMap.Add(".p7s", "application/pkcs7-signature");
ExtensionMap.Add(".pmw", "application/x-perfmon");
ExtensionMap.Add(".ps", "application/postscript");
ExtensionMap.Add(".p7c", "application/pkcs7-mime");
ExtensionMap.Add(".pbm", "image/x-portable-bitmap");
ExtensionMap.Add(".ppm", "image/x-portable-pixmap");
ExtensionMap.Add(".pub", "application/x-mspublisher");
ExtensionMap.Add(".pnm", "image/x-portable-anymap");
ExtensionMap.Add(".pml", "application/x-perfmon");
ExtensionMap.Add(".p10", "application/pkcs10");
ExtensionMap.Add(".pfx", "application/x-pkcs12");
ExtensionMap.Add(".p12", "application/x-pkcs12");
ExtensionMap.Add(".pdf", "application/pdf");
ExtensionMap.Add(".pps", "application/vnd.ms-powerpoint");
ExtensionMap.Add(".p7m", "application/pkcs7-mime");
ExtensionMap.Add(".pko", "application/vndms-pkipko");
ExtensionMap.Add(".ppt", "application/vnd.ms-powerpoint");
ExtensionMap.Add(".pmr", "application/x-perfmon");
ExtensionMap.Add(".pma", "application/x-perfmon");
ExtensionMap.Add(".pot", "application/vnd.ms-powerpoint");
ExtensionMap.Add(".prf", "application/pics-rules");
ExtensionMap.Add(".pgm", "image/x-portable-graymap");
ExtensionMap.Add(".qt", "video/quicktime");
ExtensionMap.Add(".ra", "audio/x-pn-realaudio");
ExtensionMap.Add(".rgb", "image/x-rgb");
ExtensionMap.Add(".ram", "audio/x-pn-realaudio");
ExtensionMap.Add(".rmi", "audio/mid");
ExtensionMap.Add(".ras", "image/x-cmu-raster");
ExtensionMap.Add(".roff", "application/x-troff");
ExtensionMap.Add(".rtf", "application/rtf");
ExtensionMap.Add(".rtx", "text/richtext");
ExtensionMap.Add(".sv4crc", "application/x-sv4crc");
ExtensionMap.Add(".spc", "application/x-pkcs7-certificates");
ExtensionMap.Add(".setreg", "application/set-registration-initiation");
ExtensionMap.Add(".snd", "audio/basic");
ExtensionMap.Add(".stl", "application/vndms-pkistl");
ExtensionMap.Add(".setpay", "application/set-payment-initiation");
ExtensionMap.Add(".stm", "text/html");
ExtensionMap.Add(".shar", "application/x-shar");
ExtensionMap.Add(".sh", "application/x-sh");
ExtensionMap.Add(".sit", "application/x-stuffit");
ExtensionMap.Add(".spl", "application/futuresplash");
ExtensionMap.Add(".sct", "text/scriptlet");
ExtensionMap.Add(".scd", "application/x-msschedule");
ExtensionMap.Add(".sst", "application/vndms-pkicertstore");
ExtensionMap.Add(".src", "application/x-wais-source");
ExtensionMap.Add(".sv4cpio", "application/x-sv4cpio");
ExtensionMap.Add(".tex", "application/x-tex");
ExtensionMap.Add(".tgz", "application/x-compressed");
ExtensionMap.Add(".t", "application/x-troff");
ExtensionMap.Add(".tar", "application/x-tar");
ExtensionMap.Add(".tr", "application/x-troff");
ExtensionMap.Add(".tif", "image/tiff");
ExtensionMap.Add(".txt", "text/plain");
ExtensionMap.Add(".texinfo", "application/x-texinfo");
ExtensionMap.Add(".trm", "application/x-msterminal");
ExtensionMap.Add(".tiff", "image/tiff");
ExtensionMap.Add(".tcl", "application/x-tcl");
ExtensionMap.Add(".texi", "application/x-texinfo");
ExtensionMap.Add(".tsv", "text/tab-separated-values");
ExtensionMap.Add(".ustar", "application/x-ustar");
ExtensionMap.Add(".uls", "text/iuls");
ExtensionMap.Add(".vcf", "text/x-vcard");
ExtensionMap.Add(".wps", "application/vnd.ms-works");
ExtensionMap.Add(".wav", "audio/wav");
ExtensionMap.Add(".wrz", "x-world/x-vrml");
ExtensionMap.Add(".wri", "application/x-mswrite");
ExtensionMap.Add(".wks", "application/vnd.ms-works");
ExtensionMap.Add(".wmf", "application/x-msmetafile");
ExtensionMap.Add(".wcm", "application/vnd.ms-works");
ExtensionMap.Add(".wrl", "x-world/x-vrml");
ExtensionMap.Add(".wdb", "application/vnd.ms-works");
ExtensionMap.Add(".wsdl", "text/xml");
ExtensionMap.Add(".xml", "text/xml");
ExtensionMap.Add(".xlm", "application/vnd.ms-excel");
ExtensionMap.Add(".xaf", "x-world/x-vrml");
ExtensionMap.Add(".xla", "application/vnd.ms-excel");
ExtensionMap.Add(".xls", "application/vnd.ms-excel");
ExtensionMap.Add(".xof", "x-world/x-vrml");
ExtensionMap.Add(".xlt", "application/vnd.ms-excel");
ExtensionMap.Add(".xlc", "application/vnd.ms-excel");
ExtensionMap.Add(".xsl", "text/xml");
ExtensionMap.Add(".xbm", "image/x-xbitmap");
ExtensionMap.Add(".xlw", "application/vnd.ms-excel");
ExtensionMap.Add(".xpm", "image/x-xpixmap");
ExtensionMap.Add(".xwd", "image/x-xwindowdump");
ExtensionMap.Add(".xsd", "text/xml");
ExtensionMap.Add(".z", "application/x-compress");
ExtensionMap.Add(".zip", "application/x-zip-compressed");
ExtensionMap.Add(".*", "application/octet-stream");
}
public static string GetMimeMapping(string fileExtension)
{
if (ExtensionMap.ContainsKey(fileExtension))
return ExtensionMap[fileExtension];
else
return ExtensionMap[".*"];
}
}
mime Apache mime.types로 Dictionary<string, string>
파일 확장명으로 키가 지정되었습니다.여기 있습니다.
https://github.com/cymen/ApacheMimeTypesToDotNet
실제 출력은 다음 파일입니다.
https://github.com/cymen/ApacheMimeTypesToDotNet/blob/master/ApacheMimeTypes.cs
다른 누군가가 그것을 유용하게 생각하기를 바랍니다!
Nisus - 유틸리티의 전체 소스 코드를 어딘가에 게시할 의향이 있습니까?그것은 정말 도움이 될 것입니다.감사합니다!
신경쓰지 마...
Apache 정의 파일을 확장명이 정의된 항목만 포함하도록 편집한 다음, 실행 시 텍스트 파일에서 형식/확장명을 로드하도록 코드를 확장했습니다.우아하지는 않지만 마임 유형에 대한 630줄의 소스 코드를 생성/유지하는 것보다 확실히 낫습니다.
[MimeTypeCollection의 생성자에서 이 항목 대신: this.추가(새 마임)TypeInfo("application/applixware", 새 목록(새 [] {.aw" ▁type
// import mime/extension definition list to facilitate maintenance
string dir = AppDomain.CurrentDomain.BaseDirectory;
using (TextReader streamReader = new StreamReader(Path.Combine(dir, "MimeDefinitions.txt")))
{
string input;
while ((input = streamReader.ReadLine()) != null)
{
if (input.Substring(0, 1) != "#")
{
// text line format ::= [contenttype]<tab>[space delimited list of extensions, without dot]
string contentType = input.Group("0\t1");
string extensionList = input.Group("1\t1");
string[] extensions = extensionList.Split(" ".ToCharArray());
List<string> extensionSet = new List<string>();
foreach (string term in extensions)
{
extensionSet.Add("."+term);
}
this.Add(new mimeTypeInfo(contentType, extensionSet));
}
}
}
또한 Init() 메서드가 호출되고 _extensions 및 _mime 멤버가 완전히 초기화되지 않는 것을 발견하여 다음을 읽도록 변경했습니다.
if (_extensions == null || _mimes == null || _mimes.Count != this.Count)
어쨌든, 나는 이제 내가 필요로 했던 외부 정의와 로컬 레지스트리를 처리할 수 있는 클래스를 알게 되었습니다.
감사합니다!
또한 Init() 메서드가 호출되고 _extensions 및 _mime 멤버가 완전히 초기화되지 않아 읽기로 변경했습니다. 가장 좋은 방법은 MimeTypeCollection에서 생성자의 GetExtension 호출을 제거하는 것입니다.
public MimeTypeCollection()
{
this.Add(new mimeTypeInfo("application/applixware", new List<string>(new[] { ".aw" })));
this.Add(new mimeTypeInfo("application/atom+xml", new List<string>(new[] { ".atom" })));
// ... Whole list from apache's site
this.Add(new mimeTypeInfo("x-x509-ca-cert", new List<string>(new[] { ".cer" })));
try
{
using (RegistryKey classesRoot = Registry.ClassesRoot)
using (RegistryKey typeKey = classesRoot.OpenSubKey(@"MIME\Database\Content Type"))
{
string[] subKeyNames = typeKey.GetSubKeyNames();
string extension = string.Empty;
foreach (string keyname in subKeyNames)
{
string trimmed = (keyname ?? string.Empty).Trim();
if (string.IsNullOrEmpty(trimmed))
continue;
if (this.Exists(mime => mime.MimeType == trimmed))
continue;
//if (!String.IsNullOrEmpty(GetExtension(trimmed)))
// continue;
string subKey = "MIME\\Database\\Content Type\\" + trimmed;
using (RegistryKey curKey = classesRoot.OpenSubKey(subKey))
{
extension = (curKey.GetValue("Extension") as string ?? string.Empty).Trim();
if (extension.Length > 0)
this.Add(new mimeTypeInfo(trimmed
, new List<string>(new[] { extension })));
}
}
}
}
catch (Exception ex)
{
string s = ex.ToString();
}
}
파일의 Mime/content type을 실제 내용과 비교하여 확인하지 않고 검색하면 시스템 및 사용자에게 심각한 보안 위험이 발생할 수 있으므로 주의를 당부드립니다.
이러한 경우에도 공격자는 실행 파일 또는 스크립트를 의심할 수 없는 다른 파일 형식으로 위장하여 잠재적으로 시스템을 공격하거나 악성 파일을 다른 사용자에게 전파하는 메커니즘으로 사용할 수 있습니다.
업로드한 파일을 계속 처리하거나 다운로드할 수 있도록 설정하기 전에 샌드박스를 설치하고 업로드한 파일에 대한 자세한 내용을 검사하는 것을 진지하게 고려하는 것이 좋습니다.
언급URL : https://stackoverflow.com/questions/1612767/file-extensions-and-mime-types-in-net
'programing' 카테고리의 다른 글
데이터 프레임의 모든 열에서 데이터 출력(판다) (0) | 2023.08.09 |
---|---|
MariaDB Prepared 문에서 잘못된 형식의 통신 패킷을 반환합니다. (0) | 2023.08.09 |
Base64 인코딩 이미지 (0) | 2023.08.09 |
하위 쿼리를 처리하기 위한 MariaDB 이전 버전 (0) | 2023.08.09 |
UIScrollView 페이지 변경 검색 중 (0) | 2023.08.09 |