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

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

314149 次浏览

路径

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

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

您应该检查默剧类型是

video/x-flv

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

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

我不知道这是不是你想要的,但是:

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

或者:

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

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

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

你可以检查.flv 签名。你可以在这里下载规格:

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

参见“ FLV 头”章节。

此外,如果你有一个 FileInfo 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

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


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

如果 isAllowed等于 true,那么它的 FLV。

OR

读取文件的内容

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

前两三个字母会告诉你文件类型。
在 FLV 的情况下,它的“ FLV... ...”

content.StartsWith("FLV")

这个解决方案也适用于多个扩展名的情况,比如“ Avishay.stuent.DB”

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

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

上面的方法在 Firefox 和 IE 上运行良好: 我能够查看所有类型的文件,比如 zip、 txt、 xls、 xlsx、 doc、 docx、 jpg、 png。

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

值得一提的是,如何在获得延长期的同时删除延长期:

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

Path.GetExtension(file.FileName))将为您提供文件名

如果有人需要测试扩展名或名称,我也会共享一个测试代码。

形成名为 test.txt 的文本文件并在 xUnit 中检查其扩展。

        [Fact]
public void WrongFileExtention_returnError()
{
//Arrange
string expectedExtention = ".csv";
var content = "Country,Quantity\nUnited Kingdom,1";
var fileName = "test.csv";
var stream = new MemoryStream();
var writer = new StreamWriter(stream);
writer.Write(content);
writer.Flush();
stream.Position = 0;


//Act
IFormFile file = new FormFile(stream, 0, stream.Length, "", fileName);
            

//Assert
Assert.Equal(expectedExtention, Path.GetExtension(file.FileName));


}

如期返回 true,文件扩展名为 name。

希望这对某些人有所帮助:)。

我知道这是一个相当老的问题,但这里有一篇关于获得文件扩展名以及一些更多值的文章:

在 C # 中获取文件扩展名

我希望这有所帮助: —— !