![](/img/trans.png)
[英]Is there a .NET Framework equivalent to .NET Core's IControllerActivator?
[英].NET Framework equivalent for Python's imghdr
Python 的imghdr
模块确定文件或字节 stream 中包含的图像类型。
在.Net Framework 中是否有python 的imghdr
模块的等价物?
就在最近,我需要确定文件中使用的 mime 类型。 我不知道这个 windows API 调用背后的确切逻辑,但我怀疑它进入文件内部以了解它的 mime 类型。 希望这会有所帮助
using System;
using System.IO;
using System.Runtime.InteropServices;
namespace SomeNamespace
{
/// <summary>
/// This will work only on windows
/// </summary>
public class MimeTypeFinder
{
[DllImport(@"urlmon.dll", CharSet = CharSet.Auto)]
private extern static UInt32 FindMimeFromData(
UInt32 pBC,
[MarshalAs(UnmanagedType.LPStr)] String pwzUrl,
[MarshalAs(UnmanagedType.LPArray)] byte[] pBuffer,
UInt32 cbSize,
[MarshalAs(UnmanagedType.LPStr)]String pwzMimeProposed,
UInt32 dwMimeFlags,
out UInt32 ppwzMimeOut,
UInt32 dwReserverd
);
public string GetMimeFromFile(string filename)
{
if (!File.Exists(filename))
throw new FileNotFoundException(filename + " not found");
var buffer = new byte[256];
using (var fs = new FileStream(filename, FileMode.Open))
{
if (fs.Length >= 256)
fs.Read(buffer, 0, 256);
else
fs.Read(buffer, 0, (int)fs.Length);
}
try
{
UInt32 mimetype;
FindMimeFromData(0, null, buffer, 256, null, 0, out mimetype, 0);
var mimeTypePtr = new IntPtr(mimetype);
var mime = Marshal.PtrToStringUni(mimeTypePtr);
Marshal.FreeCoTaskMem(mimeTypePtr);
return mime;
}
catch (Exception)
{
return "unknown/unknown";
}
}
}
}
如果您可以信任文件的扩展名,则可以执行 rails 插件mimetype-fu之类的操作。
这个插件有一个 yaml 扩展列表及其已知的 mime 类型。 这是相当详尽的。 我们为 .net 找到了 yaml 解析器,并简单地使用了 mimetype-fu 的 yaml。 这使得它既可以快速构建又可以快速执行。
如果您只处理流并且没有文件名,则上述方法可能更适合您。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.