如何在C#中查找文件的扩展名?

如何在C#中查找文件的扩展名?,c#,C#,在我的web应用程序(asp.net,c#)中,我在页面中上载视频文件,但我只想上载flv视频。上传其他扩展视频时如何限制? 在服务器上,您可以检查MIME类型,在这里或谷歌上查找flv MIME类型 您应该检查mime类型是否正确 video/x-flv 例如,如果您在C#中使用文件上载,您可以这样做 FileUpload.PostedFile.ContentType == "video/x-flv" 我不确定这是否是您想要的,但是: Directory.GetFiles(@"c:\myd

在我的web应用程序(asp.net,c#)中,我在页面中上载视频文件,但我只想上载flv视频。上传其他扩展视频时如何限制?


在服务器上,您可以检查MIME类型,在这里或谷歌上查找flv MIME类型

您应该检查mime类型是否正确

video/x-flv
例如,如果您在C#中使用文件上载,您可以这样做

FileUpload.PostedFile.ContentType == "video/x-flv"

我不确定这是否是您想要的,但是:

Directory.GetFiles(@"c:\mydir", "*.flv");
或:


您将无法限制用户在客户端上传的文件类型[*]。您只能在服务器端执行此操作。如果用户上载的文件不正确,则只有在上载文件后,您才能识别该文件。没有可靠和安全的方法来阻止用户上传他们想要的任何文件格式


[*]是的,在开始上传之前,你可以做各种聪明的事情来检测文件扩展名,但不要依赖它。有人迟早会绕过它,上传他们喜欢的任何东西。

你可以查看.flv签名。您可以在此处下载规范:


请参阅“FLV标题”一章。

此外,如果您有
文件信息fi
,您只需执行以下操作:

string ext = fi.Extension;

并且它将保存文件的扩展名(注意:它将包括
,因此上面的结果可能是:
.jpg
.txt
,等等……

您可以简单地读取文件流

using (var target = new MemoryStream())
{
    postedFile.InputStream.CopyTo(target);
    var array = target.ToArray();
}
前5/6索引将告诉您文件类型。对于FLV,它是70、76、86、1、5

如果
被允许
等于
则其FLV

读取文件的内容

var contentArray = target.GetBuffer();
var content = Encoding.ASCII.GetString(contentArray);
前两个/三个字母将告诉您文件类型。
如果是FLV,其“FLV……”


此解决方案也有助于实现多个扩展,如“Avishay.student.DB”

在上找到了我更喜欢的替代解决方案,因为它不需要您指定路径

        // This custom method takes a path 
        // and adds all files and folder names to the 'files' array
        string[] files = Utilities.FileList("C:\", "");
        // Then for each array item...
        foreach (string f in files)
        {
            // Here is the important line I used to ommit .DLL files:
            if (!f.EndsWith(".dll", StringComparison.Ordinal))
                // then populated a listBox with the array contents
                myListBox.Items.Add(f);
        }
上述方法在firefox和IE上运行良好,我能够查看所有类型的文件,如zip、txt、xls、xlsx、doc、docx、jpg、png


但是,当我试图从Google Chrome中查找文件扩展名时,我失败了。

值得一提的是,如何在获取扩展名的同时删除扩展名:

var name = Path.GetFileNameWithoutExtension(fileFullName); // Get the name only

var extension = Path.GetExtension(fileFullName); // Get the extension only

如果可能,您还希望检查客户端,以避免不必要的上载。是的,但请参阅下面的答案-不要依赖客户端检查-它迟早会被绕过。:)客户端检查不是对服务器的保护,而是对用户的方便。已授予。我只是建议OP不要依赖它。虽然他不能阻止黑客上传他想要的东西,但他还是应该检查客户端,以方便用户。Flash上传者应该能够检查文件类型。OP没有提到Flash上传者(即“用Flash编写的上传者”,而不是“Flash内容上传者”)。该问题使用asp.net和c#标记进行标记,通过这些技术选择,客户端检查受到限制,并且很容易失败。:)对于一个视频上传站点,客户端应该有比HTML上传表单更好的东西。没有进度条的多MB上传没有意思。好吧,你是说客户端检查不太好,我怎么能在服务器端检查Mr。ZombieSheep@Thilo-我完全同意,但问题是关于ASP.net上载表单的。这取决于OP是否认为这足够好。这允许某人重命名任何文件*.flv并上传它。根据您的要求,您可能还需要检查MIME类型。MIME类型通常不是根据文件扩展名设置的吗?@Thilo,您是对的,但是可以在不更改MIME内容类型的情况下更改扩展名。mime类型描述文件中包含的数据,因此可以对其进行适当处理。请参见“否”,更好的方法是检查文件内容。有必要检查flv签名。只是为了补充这一点,因为它仍然是一个流行的答案-MIME类型参数与扩展一样不安全,因为两者都可能被欺骗。这两种检查的结合可能是一种合理的解决方案,但最终如果安全性是一个问题,则应进行更严格的检查,例如阻止未签名的文件或内容采样。这应被评为更高级别。如果您确实希望应用程序正常工作,并且数据不可信,则应检查开头。
var contentArray = target.GetBuffer();
var content = Encoding.ASCII.GetString(contentArray);
content.StartsWith("FLV")
                FileInfo FileInf = new FileInfo(filePath);
                string strExtention = FileInf.Name.Replace(System.IO.Path.GetFileNameWithoutExtension(FileInf.Name), "");
        // This custom method takes a path 
        // and adds all files and folder names to the 'files' array
        string[] files = Utilities.FileList("C:\", "");
        // Then for each array item...
        foreach (string f in files)
        {
            // Here is the important line I used to ommit .DLL files:
            if (!f.EndsWith(".dll", StringComparison.Ordinal))
                // then populated a listBox with the array contents
                myListBox.Items.Add(f);
        }
string FileExtn = System.IO.Path.GetExtension(fpdDocument.PostedFile.FileName);
var name = Path.GetFileNameWithoutExtension(fileFullName); // Get the name only

var extension = Path.GetExtension(fileFullName); // Get the extension only
private string GetExtension(string attachment_name)
{
    var index_point = attachment_name.IndexOf(".") + 1;
    return attachment_name.Substring(index_point);
}