【问题标题】:How to find the extension of a file in C#?如何在 C# 中找到文件的扩展名?
【发布时间】:2010-12-25 14:30:24
【问题描述】:

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

【问题讨论】:

  • 如果可能,您还想在客户端上进行检查,以避免不必要的上传。
  • 是的,但是请参阅下面的答案-不要依赖客户端检查-迟早会被规避。 :)
  • 客户端检查不是为了保护你的服务器,而是为了方便用户。
  • 同意。我只是建议 OP 不要依赖它。

标签: c# file file-extension


【解决方案1】:

Path.GetExtension

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

【讨论】:

  • 这允许某人重命名任何文件 *.flv 并上传它。根据您的要求,您可能还需要检查 MIME 类型。
  • MIME类型一般不是根据文件扩展名设置的吗?
  • @Thilo,你是对的,但是可以在不改变 mime 内容类型的情况下更改扩展名。 mime 类型描述了文件中包含的数据,所以可以适当处理见en.wikipedia.org/wiki/MIME
  • 不,更好的方法是检查文件内容。需要检查flv签名。
  • 只是补充一点,因为它仍然是一个流行的答案 - MIME 类型参数与扩展名一样不安全,因为两者都可以被欺骗。两种检查的组合可能是一个合理的解决方案,但最终如果安全是一个问题,那么应该有更严格的检查,例如阻止未签名的文件或内容采样。
【解决方案2】:

你可以简单地读取文件流

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】:

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

您应该检查 mime 类型是否为

video/x-flv

例如,如果您在 C# 中使用 FileUpload,您可以这样做

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

【讨论】:

    【解决方案4】:
    string FileExtn = System.IO.Path.GetExtension(fpdDocument.PostedFile.FileName);
    

    上述方法适用于 Firefox 和 IE:我可以查看所有类型的文件,例如 zip、txt、xls、xlsx、doc、docx、jpg、png。

    但是当我尝试从谷歌浏览器中查找文件的扩展名时,我失败了。

    【讨论】:

    • Firefox、IE、Chrome和C#之间的关系是什么? OP 是在谈论服务器端代码,而不是关于浏览器或任何类型的客户端代码......
    【解决方案5】:

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

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

    或者:

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

    【讨论】:

      【解决方案6】:

      另外,如果你有FileInfo fi,你可以这样做:

      string ext = fi.Extension;
      

      它会保存文件的扩展名(注意:它将包括.,所以上面的结果可能是:.jpg.txt,等等......

      【讨论】:

        【解决方案7】:

        EndsWith()

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

        【讨论】:

          【解决方案8】:

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

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

          【讨论】:

            【解决方案9】:

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

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

            【讨论】:

            • 虽然他无法阻止黑客上传他想要的内容,但为了方便用户,他仍然应该在客户端进行检查。 Flash 上传者应该能够检查文件类型。
            • OP 没有提到 Flash 上传器(即“用 Flash 编写的上传器”,而不是“Flash 内容的上传器”)。该问题使用 asp.net 和 c# 标记,并且通过这些技术选择,客户端检查受到限制并且很容易被击败。 :)
            • 对于一个视频上传网站,他应该在客户端有比 HTML 上传表单更好的东西。没有进度条的多 MB 上传并不好玩。
            • 好吧,你说客户端检查不是很好,我如何检查服务器端 ZombieSheep 先生
            • @Thilo - 我完全同意,但问题是关于 ASP.net 上传表单。这取决于 OP 他是否认为这足够好。
            【解决方案10】:

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

            http://www.adobe.com/devnet/flv/

            请参阅“FLV 标头”一章。

            【讨论】:

              【解决方案11】:
              private string GetExtension(string attachment_name)
              {
                  var index_point = attachment_name.IndexOf(".") + 1;
                  return attachment_name.Substring(index_point);
              }
              

              【讨论】:

                【解决方案12】:

                此解决方案还有助于处理多个扩展,例如“Avishay.student.DB”

                                FileInfo FileInf = new FileInfo(filePath);
                                string strExtention = FileInf.Name.Replace(System.IO.Path.GetFileNameWithoutExtension(FileInf.Name), "");
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2013-02-10
                  • 1970-01-01
                  • 2013-07-05
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-07-15
                  相关资源
                  最近更新 更多