c# - 根据输入流检查上传的文件是否为视频
问题描述
我在 C# 中有一个 Web 表单应用程序,我必须根据它的输入流检查文件类型是否为视频。
我尝试了几种方法,包括以下方法。
protected void btnUpload_Click(object sender, EventArgs e)
{
if (FileUpload1.PostedFile != null)
{
try
{
string FileName = Path.GetFileName(FileUpload1.PostedFile.FileName);
if (FileUpload1.PostedFile.InputStream.Length <= 0)
txt_response.Text = "Invalid file.";
byte[] buffer = new byte[256];
Stream fs = FileUpload1.PostedFile.InputStream;
BinaryReader br = new BinaryReader(fs);
if (fs.Length >= 256)
fs.Read(buffer, 0, 256);
else
fs.Read(buffer, 0, (int)fs.Length);
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);
//mime of video file remains application/octet-stream
}
catch (Exception ex)
{
throw ex;
}
}
}
[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);
}
上面的代码适用于大多数文件类型,但对于视频,它返回 application/octate-stream,尽管视频是 mp4。
有没有办法我们可以检查该缓冲区并确定它是视频文件还是图像文件等?
任何帮助将非常感激。谢谢!
解决方案
你检查过MetadataExtractor库吗?我用它来检查我的应用程序中的输入文件是否是 MP4:
var fileType = FileTypeDetector.DetectFileType(fileStream);
IsVideoFileFormatValid = fileType == FileType.Mp4;
看看他们文档的这个页面。
免责声明:我与该项目没有任何关系。
推荐阅读
- r - 在 R 中查找区域年度最大值
- php - 错误包括(php.php):无法打开流:没有这样的文件或目录 Yii 版本 1.1.22 + S3
- cluster-analysis - ELKI:如何为 K-Means 指定 CSV 的特征列
- elasticsearch - 拆分文本包含
分成 3 个令牌 - woocommerce - 在 Woocommerce API 的重复 SKU 检查之前是否有一个钩子?
- notifications - 您可以在退出区域时对 ibeacon 通知应用时间限制吗?
- coldfusion - 冷箱模型关系
- amazon-ec2 - aws 实例 EC2。它会自动关闭。因为你可以自动打开它
- azure - 无法使用 az 登录
- android - 如何避免兄弟视图之间的点击转移?