使用HttpPostedFileBase验证格式的视频文件

时间:2012-03-23 17:00:13

标签: asp.net-mvc-3 file validation video format

有没有办法使用HttpPostedFileBase元素来查明它是否是一个有效的视频文件fomart(验证扩展名除外)。我顺便使用aspnet mvc 3。

2 个答案:

答案 0 :(得分:0)

无法验证。您需要验证文件的扩展名。也许这会有所帮助:http://blog.tomasjansson.com/2011/08/creating-custom-unobtrusive-file-extension-validation-in-asp-net-mvc-3-and-jquery/

答案 1 :(得分:0)

如果您想绝对确定,最好检查HttpPostedFileBase的流以查找魔术字节。这是因为某些应用程序可能会将其编写为您认为可以处理的扩展(例如MP4),但实际上它是另一种格式,例如M4V。

例如,要检查流是否是MP4变体流,您可以检查流是否以字节0x00,0x00,0x00,0x20,0x66,0x74,0x79,0x70,0x6D,0x70和0x34开头。您可以找到更多格式here

这样的事情可能有用:

public static bool IsMP4(System.IO.Stream stream)
{
    return HasMagicBytes(stream, 0, 0x00, 0x00, 0x00, 0x20, 0x66, 0x74, 0x79, 0x70, 0x6D, 0x70, 0x34);
}

public static bool HasMagicBytes (System.IO.Stream stream, int offset, params byte[] magicBytes)
{
    try {
        bool match = false;
        byte[] bytes = new byte[magicBytes.Length];
        if (stream.Read (bytes, offset, magicBytes.Length) == magicBytes.Length) {
            for (int i = 0; i < magicBytes.Length; i++) {
                if (bytes [i] != magicBytes [i]) {
                    return false;
                }
            }   
            return true;
        } else {
            return false;
        }

    } finally {
        stream.Seek (0, System.IO.SeekOrigin.Begin);
    }

}

应该注意流是否可以搜索。对于较大的文件,此技术相当有效。要使其可重用,您可以编写ValidationAttribute,以便可以像这样定义模型:

public class MyModel
{
    [CheckFormat(0x00, 0x00, 0x00, 0x20, 0x66, 0x74, 0x79, 0x70, 0x6D, 0x70, 0x34)]
    public HttpPostedFileBase MyFile { get; set; }
}

但我会留给你进一步调查。