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


135

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


1
如果可能,您还希望检查客户端,以避免不必要的上传。
Thilo

2
是的,但是请在下面查看我的答案-不要依靠客户端检查-迟早会绕开它。:)
ZombieSheep

4
客户端检查不是对服务器的保护,而是对用户的便利。
Thilo

授予。我只是建议OP不要依赖它。
ZombieSheep,2009年

Answers:


269

Path.GetExtension

string myFilePath = @"C:\MyFile.txt";
string ext = Path.GetExtension(myFilePath);
// ext would be ".txt"

8
这使某人可以重命名任何文件* .flv并上传它。根据您的要求,您可能还需要检查MIME类型。
大卫·格伦

通常不会根据文件扩展名设置MIME类型吗?
Thilo

@Thilo,您是对的,但是可以在不更改mime内容类型的情况下更改扩展名。MIME类型描述了文件中包含的数据,因此可以对其进行适当的处​​理,请参见en.wikipedia.org/wiki/MIME
Mark Dickinson,2009年

2
不,更好的方法是检查文件内容。有必要检查flv签名。
Marat Faskhiev,09年

补充一下,因为它仍然是一个流行的答案-MIME类型参数与扩展一样不安全,因为两者都可以被欺骗。结合使用这两种检查可能是一个合理的解决方案,但是最终如果考虑到安全性,则应该进行更严格的检查,例如阻止未签名的文件或内容采样。
詹姆斯

21

您可以简单地读取文件流

using (var target = new MemoryStream())
{
    postedFile.InputStream.CopyTo(target);
    var array = target.ToArray();
}

前5/6个索引将告诉您文件类型。在FLV其的情况下70,76,86,1,5

private static readonly byte[] FLV = { 70, 76, 86, 1, 5};

bool isAllowed = array.Take(5).SequenceEqual(FLV);

如果isAllowed等于,true则其FLV。

要么

读取文件内容

var contentArray = target.GetBuffer();
var content = Encoding.ASCII.GetString(contentArray);

前两个/三个字母将告诉您文件类型。
如果是FLV,则其“ FLV ......”

content.StartsWith("FLV")

3
应该给它更高的评价。如果您确实希望您的应用程序正常工作并且数据不受信任,则应检查开头。
PRMan

7

在服务器上,您可以在此处或在Google上检查MIME类型,查找flv mime类型。

您应该检查mime类型是否为

video/x-flv

例如,如果您在C#中使用FileUpload,则可以

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

5

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

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

要么:

Path.GetExtension(@"c:\test.flv")

4

此外,如果您有FileInfo fi,则可以简单地执行以下操作:

string ext = fi.Extension;

并将保留文件的扩展名(请注意:它将包含.,因此上述结果可能是:.jpg .txt,依此类推...。


2

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

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


1
尽管他不能阻止黑客上传他想要的东西,但他仍应在客户端进行检查,以方便用户使用。Flash上​​载器应该能够检查文件类型。
Thilo

1
OP没有提到Flash上​​传器(即“用Flash编写的上传器”,而不是“ Flash内容的上传器”)。该问题用asp.net和c#标签标记,并且通过这些技术选择,客户端检查受到限制,并且很容易被击败。:)
ZombieSheep

对于视频上传网站,他应该在客户端上比HTML上传表单更好。没有进度条的多MB上传并不有趣。
Thilo

好的,您说客户端检查不是很好,我该如何在服务器端检查ZombieSheep先生
Surya sasidhar,2009年

@Thilo-我不同意,但是问题是关于ASP.net上传表单。他是否认为这足够好取决于OP。
ZombieSheep,2009年


2

以。。结束()

DotNetPerls上找到了我更喜欢的替代解决方案,因为它不需要您指定路径。这是一个在自定义方法的帮助下填充数组的示例

        // 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);
        }

2
string FileExtn = System.IO.Path.GetExtension(fpdDocument.PostedFile.FileName);

上面的方法在Firefox和IE上都可以正常工作,我能够查看所有类型的文件,例如zip,txt,xls,xlsx,doc,docx,jpg,png

但是当我尝试从googlechrome查找文件扩展名时,我失败了。


2

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

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

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

0

如果有多个扩展名(例如“ Avishay.student.DB”),此解决方案也有帮助

                FileInfo FileInf = new FileInfo(filePath);
                string strExtention = FileInf.Name.Replace(System.IO.Path.GetFileNameWithoutExtension(FileInf.Name), "");
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.