如何获取文件扩展名(不是来自其名称或来自contentType)

时间:2014-09-16 21:48:06

标签: c# asp.net file file-upload file-extension

我只是想知道发布的文件扩展名类型,

     public static void UploadFile(HttpPostedFile file)
    { 
        ....

        if (file != null && file.ContentLength > 0)
        {
            string fileName = file.FileName;
            string contentType = file.ContentType;

            file.SaveAs(path);
        }

    } 

上面的代码为我们提供了contentType

但如果我们手动更改扩展名,例如,如果我将untitled.exe更改为untitled.txt,则contentType将成为文本。但我想知道它是一个exe。

有可能吗? 或者另一种方式是安全的吗? (我认为没有)

2 个答案:

答案 0 :(得分:1)

您要问的是基于其签名的文件识别。这不是100%保证可以工作,但有一些实用程序可以帮助您。

例如TrID有一个签名数据库,可以尝试为您匹配该文件,也可以选择重命名。

File Identifier是另一个。

如果要保存文件并希望阻止用户在系统中保存具有特定扩展名的文件,那么您当然可以使用FileInfo类检查扩展名。像这样......

var invalidExtensions = new List<string>() { ".exe", ".dll" };

...

var fileInfo = new FileInfo(file.FileName);
if (invalidExtensions.Contains(fileInfo.Extension.ToLower()))
{
     // Do your cleanup on the filename because it's an extension you don't want
     //   to save...
}

答案 1 :(得分:1)

如果用户在上传之前手动更改了文件,则无法确定文件的原始扩展名。但是,某些文件类型具有可用于终止其类型的文件的标头。示例可能是office docs,pdfs ...除了来自未知来源的任意文件外,您必须小心谨慎。扩展在很大程度上是Windows功能,其他一些操作系统类型不使用或依赖它们。