首页 > 解决方案 > 根据输入流检查上传的文件是否为视频

问题描述

我在 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。

有没有办法我们可以检查该缓冲区并确定它是视频文件还是图像文件等?

任何帮助将非常感激。谢谢!

标签: c#file-uploadmime-typescontent-type

解决方案


你检查过MetadataExtractor库吗?我用它来检查我的应用程序中的输入文件是否是 MP4:

var fileType = FileTypeDetector.DetectFileType(fileStream);

IsVideoFileFormatValid = fileType == FileType.Mp4;

看看他们文档的这个页面

免责声明:我与该项目没有任何关系。


推荐阅读