2009-12-11 195 views
66

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

+1

如果可能,还希望检查客户端,以避免不必要的上传。 – Thilo 2009-12-11 09:37:36

+2

是的,但请参阅下面的答案 - 不要依赖客户端检查 - 它迟早会被绕过。 :) – ZombieSheep 2009-12-11 09:39:26

+3

客户端检查不是为您的服务器提供保护,而是为用户提供便利。 – Thilo 2009-12-11 09:41:14

回答

146

Path.GetExtension

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

谢谢你,詹姆斯先生,它很好地工作,谢谢你的回应 – 2009-12-11 09:44:18

+6

这允许别人重命名任何文件* .flv并上传它。根据您的要求,您可能还需要检查MIME类型。 – 2009-12-11 09:44:18

+0

通常根据文件扩展名来设置MIME类型吗? – Thilo 2009-12-11 09:49:01

7

在你可以在这里或对谷歌检查MIME类型,查找FLV MIME类型的服务器。

你应该检查MIME类型是

video/x-flv 

如果你在C#例如,使用一个FileUpload,你可以做

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

我不知道这是什么你想,但:

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

或者:

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

感谢你卡拉先生正在工作 – 2009-12-11 10:03:08

2

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

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

+1

尽管他无法阻止黑客上传他想要的内容,但他仍然应该检查客户端,以方便用户。 Flash上​​传应该能够检查文件类型。 – Thilo 2009-12-11 09:40:30

+1

OP没有提到Flash上​​传器(这是'用Flash写的上传器',而不是'Flash上​​传器')。这个问题是用asp.net和c#标签标记的,通过这些技术选择,客户端检查是有限的,很容易被打败。 :) – ZombieSheep 2009-12-11 09:44:48

+0

对于视频上传网站,他应该在客户端有更好的东西,然后HTML上传表单。没有进度条的多MB上传并不好玩。 – Thilo 2009-12-11 09:50:52

0

此外,如果你有一个FileInfo fi,你可以简单地做:

string ext = fi.Extension; 

,它会保持文件的扩展名(注:这将包括.,因此上述的结果可能是:.jpg.txt,等等....

8

您可以简单地读取文件的流

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

第一5/6索引会告诉你文件类型。在FLV的情况下,它的

私有静态只读字节[] FLV = {70,76,86,1,5};

Just do - var isAllowed = array.Take(5).SequenceEqual(FLV); 

如果是,那么它的FLV。

OR

阅读文件

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

前两/三个字母会告诉你该文件类型的内容。如果FLV其

的 “FLV | \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 ......”

Just do - content.StartsWith("FLV") 
+1

这应该被评为更高。如果你真的希望你的应用程序工作,并且数据不可信,你应该检查开始。 – PRMan 2017-04-24 21:14:08

0

该解决方案还有助于在一个以上的分机一样的情况下, “Avishay.student.DB”

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

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); 
     } 
0
string FileExtn = System.IO.Path.GetExtension(fpdDocument.PostedFile.FileName); 

以上方法正常工作与Firefox和IE浏览器的帮助下,我能够查看所有类型,如ZIP,TXT文件, xls,xlsx,doc,docx,jpg,png

但是当我试图从googlechrome找到文件的扩展名时,我失败了。