我试图动态确定输入文件的内容/类型。如果我在Windows应用程序中,我可以编写这样的代码(from this blog)
private string GetContentType(string fileName) {
string contentType = "application/octetstream";
string ext = System.IO.Path.GetExtension(fileName).ToLower();
Microsoft.Win32.RegistryKey registryKey = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(ext);
if (registryKey != null && registryKey.GetValue("Content Type") != null)
contentType = registryKey.GetValue("Content Type").ToString();
return contentType;
}
哪些其他方法更适合MVC应用程序?
我想在接收文件路径和内容类型的Controller.File(...)
方法中使用param。
答案 0 :(得分:83)
在.Net 4.5中,您可以使用:
string contentType = MimeMapping.GetMimeMapping("someFileName.pdf")
// contentType = "application/pdf"
答案 1 :(得分:14)
重要说明:此答案写于2011年,即masterwok's answer撰写前几年。虽然我的回答仍然是可接受的,但是masterwok的答案更好,更简洁。使用和upvote代替回答。以下所有内容均适用于后人。
我只是使用文件扩展名,而不是尝试做一些聪明的事情,最终可能会回来咬你的屁股。 :)
文件扩展名不需要在您的系统上注册(虽然我不知道您正在使用该文件做什么......)。如果要过滤掉文件,可以使用类似于枚举或数据库表的内容,其中包含有关可接受扩展名的信息。
请参阅此@Tolgahan's idea。我在下面基于此创建了一个C#enum,如果他们希望创建一个基于db / enum / xml的方法,那么应该为人们提供一个起点。
Public enum MimeTypes
{
[Description("application/postscript")]
ai,
[Description("audio/x-aiff")]
aif,
[Description("audio/x-aiff")]
aifc,
[Description("audio/x-aiff")]
aiff,
[Description("text/plain")]
asc,
[Description("application/atom+xml")]
atom,
[Description("audio/basic")]
au,
[Description("video/x-msvideo")]
avi,
[Description("application/x-bcpio")]
bcpio,
[Description("application/octet-stream")]
bin,
[Description("image/bmp")]
bmp,
[Description("application/x-netcdf")]
cdf,
[Description("image/cgm")]
cgm,
[Description("application/octet-stream")]
class,
[Description("application/x-cpio")]
cpio,
[Description("application/mac-compactpro")]
cpt,
[Description("application/x-csh")]
csh,
[Description("text/css")]
css,
[Description("application/x-director")]
dcr,
[Description("video/x-dv")]
dif,
[Description("application/x-director")]
dir,
[Description("image/vnd.djvu")]
djv,
[Description("image/vnd.djvu")]
djvu,
[Description("application/octet-stream")]
dll,
[Description("application/octet-stream")]
dmg,
[Description("application/octet-stream")]
dms,
[Description("application/msword")]
doc,
[Description("application/xml-dtd")]
dtd,
[Description("video/x-dv")]
dv,
[Description("application/x-dvi")]
dvi,
[Description("application/x-director")]
dxr,
[Description("application/postscript")]
eps,
[Description("text/x-setext")]
etx,
[Description("application/octet-stream")]
exe,
[Description("application/andrew-inset")]
ez,
[Description("image/gif")]
gif,
[Description("application/srgs")]
gram,
[Description("application/srgs+xml")]
grxml,
[Description("application/x-gtar")]
gtar,
[Description("application/x-hdf")]
hdf,
[Description("application/mac-binhex40")]
hqx,
[Description("text/html")]
htm,
[Description("text/html")]
html,
[Description("x-conference/x-cooltalk")]
ice,
[Description("image/x-icon")]
ico,
[Description("text/calendar")]
ics,
[Description("image/ief")]
ief,
[Description("text/calendar")]
ifb,
[Description("model/iges")]
iges,
[Description("model/iges")]
igs,
[Description("application/x-java-jnlp-file")]
jnlp,
[Description("image/jp2")]
jp2,
[Description("image/jpeg")]
jpe,
[Description("image/jpeg")]
jpeg,
[Description("image/jpeg")]
jpg,
[Description("application/x-javascript")]
js,
[Description("audio/midi")]
kar,
[Description("application/x-latex")]
latex,
[Description("application/octet-stream")]
lha,
[Description("application/octet-stream")]
lzh,
[Description("audio/x-mpegurl")]
m3u,
[Description("audio/mp4a-latm")]
m4a,
[Description("audio/mp4a-latm")]
m4b,
[Description("audio/mp4a-latm")]
m4p,
[Description("video/vnd.mpegurl")]
m4u,
[Description("video/x-m4v")]
m4v,
[Description("image/x-macpaint")]
mac,
[Description("application/x-troff-man")]
man,
[Description("application/mathml+xml")]
mathml,
[Description("application/x-troff-me")]
me,
[Description("model/mesh")]
mesh,
[Description("audio/midi")]
mid,
[Description("audio/midi")]
midi,
[Description("application/vnd.mif")]
mif,
[Description("video/quicktime")]
mov,
[Description("video/x-sgi-movie")]
movie,
[Description("audio/mpeg")]
mp2,
[Description("audio/mpeg")]
mp3,
[Description("video/mp4")]
mp4,
[Description("video/mpeg")]
mpe,
[Description("video/mpeg")]
mpeg,
[Description("video/mpeg")]
mpg,
[Description("audio/mpeg")]
mpga,
[Description("application/x-troff-ms")]
ms,
[Description("model/mesh")]
msh,
[Description("video/vnd.mpegurl")]
mxu,
[Description("application/x-netcdf")]
nc,
[Description("application/oda")]
oda,
[Description("application/ogg")]
ogg,
[Description("image/x-portable-bitmap")]
pbm,
[Description("image/pict")]
pct,
[Description("chemical/x-pdb")]
pdb,
[Description("application/pdf")]
pdf,
[Description("image/x-portable-graymap")]
pgm,
[Description("application/x-chess-pgn")]
pgn,
[Description("image/pict")]
pic,
[Description("image/pict")]
pict,
[Description("image/png")]
png,
[Description("image/x-portable-anymap")]
pnm,
[Description("image/x-macpaint")]
pnt,
[Description("image/x-macpaint")]
pntg,
[Description("image/x-portable-pixmap")]
ppm,
[Description("application/vnd.ms-powerpoint")]
ppt,
[Description("application/postscript")]
ps,
[Description("video/quicktime")]
qt,
[Description("image/x-quicktime")]
qti,
[Description("image/x-quicktime")]
qtif,
[Description("audio/x-pn-realaudio")]
ra,
[Description("audio/x-pn-realaudio")]
ram,
[Description("image/x-cmu-raster")]
ras,
[Description("application/rdf+xml")]
rdf,
[Description("image/x-rgb")]
rgb,
[Description("application/vnd.rn-realmedia")]
rm,
[Description("application/x-troff")]
roff,
[Description("text/rtf")]
rtf,
[Description("text/richtext")]
rtx,
[Description("text/sgml")]
sgm,
[Description("text/sgml")]
sgml,
[Description("application/x-sh")]
sh,
[Description("application/x-shar")]
shar,
[Description("model/mesh")]
silo,
[Description("application/x-stuffit")]
sit,
[Description("application/x-koan")]
skd,
[Description("application/x-koan")]
skm,
[Description("application/x-koan")]
skp,
[Description("application/x-koan")]
skt,
[Description("application/smil")]
smi,
[Description("application/smil")]
smil,
[Description("audio/basic")]
snd,
[Description("application/octet-stream")]
so,
[Description("application/x-futuresplash")]
spl,
[Description("application/x-wais-source")]
src,
[Description("application/x-sv4cpio")]
sv4cpio,
[Description("application/x-sv4crc")]
sv4crc,
[Description("image/svg+xml")]
svg,
[Description("application/x-shockwave-flash")]
swf,
[Description("application/x-troff")]
t,
[Description("application/x-tar")]
tar,
[Description("application/x-tcl")]
tcl,
[Description("application/x-tex")]
tex,
[Description("application/x-texinfo")]
texi,
[Description("application/x-texinfo")]
texinfo,
[Description("image/tiff")]
tif,
[Description("image/tiff")]
tiff,
[Description("application/x-troff")]
tr,
[Description("text/tab-separated-values")]
tsv,
[Description("text/plain")]
txt,
[Description("application/x-ustar")]
ustar,
[Description("application/x-cdlink")]
vcd,
[Description("model/vrml")]
vrml,
[Description("application/voicexml+xml")]
vxml,
[Description("audio/x-wav")]
wav,
[Description("image/vnd.wap.wbmp")]
wbmp,
[Description("application/vnd.wap.wbxml")]
wbmxl,
[Description("text/vnd.wap.wml")]
wml,
[Description("application/vnd.wap.wmlc")]
wmlc,
[Description("text/vnd.wap.wmlscript")]
wmls,
[Description("application/vnd.wap.wmlscriptc")]
wmlsc,
[Description("model/vrml")]
wrl,
[Description("image/x-xbitmap")]
xbm,
[Description("application/xhtml+xml")]
xht,
[Description("application/xhtml+xml")]
xhtml,
[Description("application/vnd.ms-excel")]
xls,
[Description("application/xml")]
xml,
[Description("image/x-xpixmap")]
xpm,
[Description("application/xml")]
xsl,
[Description("application/xslt+xml")]
xslt,
[Description("application/vnd.mozilla.xul+xml")]
xul,
[Description("image/x-xwindowdump")]
xwd,
[Description("chemical/x-xyz")]
xyz,
[Description("application/zip")]
zip
}
答案 2 :(得分:6)
IDEA:将格式和扩展数据(http://www.feedforall.com/mime-types.htm)放入xml或项目中作为字典,数组或其他方式进行查询,并创建一个程序来确定扩展名的mimetype ..我认为保留您的数据编译后,在xml文档上更容易修改
答案 3 :(得分:2)
.NET CORE 使用Microsoft.AspNetCore.StaticFiles
var provider = new FileExtensionContentTypeProvider();
string contentType;
if(!provider.TryGetContentType(fileName, out contentType))
{
contentType = "application/octet-stream";
}
答案 4 :(得分:0)
如果您使用的是linux / unix系统,可以使用file
命令确定文件类型。
有三组测试,按此顺序执行:文件系统测试,幻数测试和语言测试。成功的第一个测试会导致打印文件类型。
如果您使用的是Windows计算机,则通常会使用您在代码中显示的文件扩展名。
答案 5 :(得分:0)
文件是否正在上传到MVC应用程序?
public ActionResult FileUploader(HttpPostedFileBase upload)
{
string mimeType=upload.ContentType;
}
虽然有一些警告。
它使用浏览器提供的“客户端提供的”mime类型,如果上传项目的用户未经过身份验证或信任,那么这可能不是一个好主意。
此外,IE并不总是为某些文件提供标准Mime类型,特别是PNG(请参阅What is the difference between "image/png" and "image/x-png"?),这可能会影响您的应用程序。也可能不会影响您的应用程序。
我们只使用一个简单的if语句将IE png mime类型(image / x-png)转换回更常见的一个(image / png)。
答案 6 :(得分:0)
如果你想使用流
public class urlmonMimeDetect
{
[DllImport(@"urlmon.dll", CharSet = CharSet.Auto)]
private extern static System.UInt32 FindMimeFromData(
System.UInt32 pBC,
[MarshalAs(UnmanagedType.LPStr)] System.String pwzUrl,
[MarshalAs(UnmanagedType.LPArray)] byte[] pBuffer,
System.UInt32 cbSize,
[MarshalAs(UnmanagedType.LPStr)] System.String pwzMimeProposed,
System.UInt32 dwMimeFlags,
out System.UInt32 ppwzMimeOut,
System.UInt32 dwReserverd
);
public static string GetMimeFromFile(Stream fs)
{
byte[] buffer = new byte[256];
fs.Read(buffer, 0, 256);
try
{
System.UInt32 mimetype;
FindMimeFromData(0, null, buffer, 256, null, 0, out mimetype, 0);
System.IntPtr mimeTypePtr = new IntPtr(mimetype);
string mime = Marshal.PtrToStringUni(mimeTypePtr);
Marshal.FreeCoTaskMem(mimeTypePtr);
return mime;
}
catch (Exception e)
{
return "unknown/unknown";
}
}
}