如何从文件扩展名中获得MIME类型?
当前回答
你可以使用这个helper函数:
private string GetMimeType (string fileName)
{
string mimeType = "application/unknown";
string ext = System.IO.Path.GetExtension(fileName).ToLower();
Microsoft.Win32.RegistryKey regKey = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(ext);
if (regKey != null && regKey.GetValue("Content Type") != null)
mimeType = regKey.GetValue("Content Type").ToString();
return mimeType;
}
其他回答
你可以使用mimemaps类。我认为这是最简单的方法。我也给出了mimemapping的导入。因为我觉得找这些类的导入很麻烦。
import org.springframework.boot.web.server.MimeMappings;
MimeMappings mm=new MimeMappings();
String mimetype = mm.get(fileExtension);
System.out.println(mimetype);
当然,为了将通用完整性、动态性和可移植性的优势与最小的依赖性结合起来
你将结合Samuel Neff的静态字典与特定平台的查询,例如由Bryan Denny。
例如,在Linux下,命令行工具“xdg-mime”可以完成后面的部分。
FileExtension处理文件扩展名,而不是Mime。用户可以更改文件扩展名,因此请检查Mime。代码示例通过文件扩展名关联Mime,这是错误的,不能工作。
需要获取内容类型文件,并检查表Mime contetType该文件根据文件扩展名。现在,如何获得文件的内容类型?
使用FileUpload是这样的: 现在,如果我已经有文件,捕捉你的ContentType?
我已经编译了一个有名的mime类型和内容类型值的来源列表,这些值仅以文件扩展名为键(目前)。
nuget包在这里https://www.nuget.org/packages/FTTLib.dll/
来源在这里https://github.com/brondavies/filetypetranslator/
这个库被设计成:
无外部依赖 没有文件系统访问权限 内存占用小 简单的静态方法(没有扩展方法和可实例化类) 不区分大小写 可移植-工作在应用程序针对任何CLR(。NET 2.0 +)
这个helper类返回任何文件名的mime类型(内容类型)、描述和图标:
using Microsoft.Win32;
using System;
using System.Drawing;
using System.IO;
using System.Runtime.InteropServices;
public static class Helper
{
[DllImport("shell32.dll", CharSet = CharSet.Auto)]
private static extern int ExtractIconEx(string lpszFile, int nIconIndex, IntPtr[] phIconLarge, IntPtr[] phIconSmall, int nIcons);
[DllImport("user32.dll", SetLastError = true)]
private static extern int DestroyIcon(IntPtr hIcon);
public static string GetFileContentType(string fileName)
{
if (fileName == null)
{
throw new ArgumentNullException("fileName");
}
RegistryKey registryKey = null;
try
{
FileInfo fileInfo = new FileInfo(fileName);
if (string.IsNullOrEmpty(fileInfo.Extension))
{
return string.Empty;
}
string extension = fileInfo.Extension.ToLowerInvariant();
registryKey = Registry.ClassesRoot.OpenSubKey(extension);
if (registryKey == null)
{
return string.Empty;
}
object contentTypeObject = registryKey.GetValue("Content Type");
if (!(contentTypeObject is string))
{
return string.Empty;
}
string contentType = (string)contentTypeObject;
return contentType;
}
catch (Exception)
{
return null;
}
finally
{
if (registryKey != null)
{
registryKey.Close();
}
}
}
public static string GetFileDescription(string fileName)
{
if (fileName == null)
{
throw new ArgumentNullException("fileName");
}
RegistryKey registryKey1 = null;
RegistryKey registryKey2 = null;
try
{
FileInfo fileInfo = new FileInfo(fileName);
if (string.IsNullOrEmpty(fileInfo.Extension))
{
return string.Empty;
}
string extension = fileInfo.Extension.ToLowerInvariant();
registryKey1 = Registry.ClassesRoot.OpenSubKey(extension);
if (registryKey1 == null)
{
return string.Empty;
}
object extensionDefaultObject = registryKey1.GetValue(null);
if (!(extensionDefaultObject is string))
{
return string.Empty;
}
string extensionDefaultValue = (string)extensionDefaultObject;
registryKey2 = Registry.ClassesRoot.OpenSubKey(extensionDefaultValue);
if (registryKey2 == null)
{
return string.Empty;
}
object fileDescriptionObject = registryKey2.GetValue(null);
if (!(fileDescriptionObject is string))
{
return string.Empty;
}
string fileDescription = (string)fileDescriptionObject;
return fileDescription;
}
catch (Exception)
{
return null;
}
finally
{
if (registryKey2 != null)
{
registryKey2.Close();
}
if (registryKey1 != null)
{
registryKey1.Close();
}
}
}
public static void GetFileIcons(string fileName, out Icon smallIcon, out Icon largeIcon)
{
if (fileName == null)
{
throw new ArgumentNullException("fileName");
}
smallIcon = null;
largeIcon = null;
RegistryKey registryKey1 = null;
RegistryKey registryKey2 = null;
try
{
FileInfo fileInfo = new FileInfo(fileName);
if (string.IsNullOrEmpty(fileInfo.Extension))
{
return;
}
string extension = fileInfo.Extension.ToLowerInvariant();
registryKey1 = Registry.ClassesRoot.OpenSubKey(extension);
if (registryKey1 == null)
{
return;
}
object extensionDefaultObject = registryKey1.GetValue(null);
if (!(extensionDefaultObject is string))
{
return;
}
string defaultIconKeyName = string.Format("{0}\\DefaultIcon", extensionDefaultObject);
registryKey2 = Registry.ClassesRoot.OpenSubKey(defaultIconKeyName);
if (registryKey2 == null)
{
return;
}
object defaultIconPathObject = registryKey2.GetValue(null);
if (!(defaultIconPathObject is string))
{
return;
}
string defaultIconPath = (string)defaultIconPathObject;
if (string.IsNullOrWhiteSpace(defaultIconPath))
{
return;
}
string iconfileName = null;
int iconIndex = 0;
int commaIndex = defaultIconPath.IndexOf(",");
if (commaIndex > 0)
{
iconfileName = defaultIconPath.Substring(0, commaIndex);
string iconIndexString = defaultIconPath.Substring(commaIndex + 1);
if (!int.TryParse(iconIndexString, out iconIndex))
{
iconIndex = 0;
}
}
else
{
iconfileName = defaultIconPath;
iconIndex = 0;
}
IntPtr[] phiconSmall = new IntPtr[1] { IntPtr.Zero };
IntPtr[] phiconLarge = new IntPtr[1] { IntPtr.Zero };
int readIconCount = ExtractIconEx(iconfileName, iconIndex, phiconLarge, phiconSmall, 1);
if (readIconCount < 0)
{
return;
}
if (phiconSmall[0] != IntPtr.Zero)
{
smallIcon = (Icon)Icon.FromHandle(phiconSmall[0]).Clone();
DestroyIcon(phiconSmall[0]);
}
if (phiconLarge[0] != IntPtr.Zero)
{
largeIcon = (Icon)Icon.FromHandle(phiconLarge[0]).Clone();
DestroyIcon(phiconLarge[0]);
}
return;
}
finally
{
if (registryKey2 != null)
{
registryKey2.Close();
}
if (registryKey1 != null)
{
registryKey1.Close();
}
}
}
}
用法:
string fileName = "NotExists.txt";
string contentType = Helper.GetFileContentType(fileName); // "text/plain"
string description = Helper.GetFileDescription(fileName); // "Text Document"
Icon smallIcon, largeIcon;
Helper.GetFileIcons(fileName, out smallIcon, out largeIcon); // 16x16, 32x32 icons