独特地识别asp.net C#文件上传中从excel到word的扩展更改

时间:2017-04-11 11:27:11

标签: c# asp.net

**我创建了一个excel文件并更改了扩展名类型=“。docx”。我尝试upload.it上传,但如果内容和扩展名类型都不同。然后我需要阻止那个我尝试了几个代码以避免这个与幻数和哑剧类型但魔术数字是相同的单词和excel和zip也如果我改变扩展然后mime类型也改变了。所以我需要使用任何唯一标识符来标识此内容    **这里有我的示例代码,用于查找mime类型和Magic number ****

   string FileExtension = FileName.Substring((FileName.LastIndexOf(".") + 1)).ToUpper();
string MagicNumber = HexaDecimalData.Substring(0, 47);  
string HexaDecimalData=string.Empty;
string MimeType = MimeMapping.GetMimeMapping(_File.FileName);
using (var fileStream = File.OpenRead(FileName))
{
BinaryReader Reader = new BinaryReader(fileStream);
Reader.BaseStream.Position = 0x0; // The offset you are reading the data from  
byte[] data = Reader.ReadBytes(0x10); // Read 16 bytes into an array  
HexaDecimalData = BitConverter.ToString(data);
Reader.Close();
} switch (FileExtension)
{

                                case "XLS":
                                    if ((!MimeType.Equals("application/excel", StringComparison.OrdinalIgnoreCase) && 
                                        !MimeType.Equals("application/vnd.ms-excel", StringComparison.OrdinalIgnoreCase) && 
                                        !MimeType.Equals("application/x-excel", StringComparison.OrdinalIgnoreCase) && 
                                        !MimeType.Equals("application/x-msexcel", StringComparison.OrdinalIgnoreCase)) || 
                                        (!MagicNumber.StartsWith("D0-CF-11-E0-A1-B1-1A-E1") ))
                                        ErrorMessage = "Invalid File";
                                    break;
                                case "XLSX":
                                    if ((!MimeType.Equals("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", StringComparison.OrdinalIgnoreCase)) || 
                                        (!MagicNumber.StartsWith("50-4B-03-04")  && !MagicNumber.StartsWith("50-4B-05-06")  && !MagicNumber.StartsWith("50-4B-07-08") ))
                                        ErrorMessage = "Invalid File";
                                    break;
                                case "PDF":
                                    if ((!MimeType.Equals("application/pdf", StringComparison.OrdinalIgnoreCase)) || (!MagicNumber.StartsWith("25-50-44-46") ))
                                        ErrorMessage = "Invalid File";
                                    break;
                                case "DOCX":
                                    if ((!MimeType.Equals("application/vnd.openxmlformats-officedocument.wordprocessingml.document", StringComparison.OrdinalIgnoreCase)) || 
                                        (!MagicNumber.StartsWith("50-4B-03-04")  && !MagicNumber.StartsWith("50-4B-05-06")  && !MagicNumber.StartsWith("50-4B-07-08") ))
                                        ErrorMessage = "Invalid File";
                                    break;
                                case "DOC":
                                    if ((!MimeType.Equals("application/msword", StringComparison.OrdinalIgnoreCase)) || (!MagicNumber.StartsWith("D0-CF-11-E0-A1-B1-1A-E1") ))
                                        ErrorMessage = "Invalid File";
                                    break;


                            }

2 个答案:

答案 0 :(得分:1)

请查看https://stackoverflow.com/a/14276391/911804

来自以上链接:

  

但请注意,以“x”结尾的所有Office 2007文件格式都是zip   压缩的XML文档。所以这种方法不是100%安全,而是在   至少它可以帮助你过滤掉一些无效的。

<强>更新 如果您需要可靠的解决方案,请尝试以下操作,但这将非常耗时。

在切换案例语句中,尝试使用Office DLL打开上传的文件,如果打开正确,则格式正确。 添加程序集引用并使用Ms-Word程序集DLL的函数。

这可能会耗费时间,但这将提供100%的解决方案。

答案 1 :(得分:0)

您必须亲自动手才能进行正确的格式验证。您必须尝试使用​​Open XML SDK打开文件。

try-catch。如果try块成功结束,那么它就是一个Word文档 - catch块会告诉你它不是一个Word文档,或者它的某些内容被破坏了。

例如:

try
{
    // "path" is a string with the path to the file.
    // The "false" parameter indicates we don't intend do edit the file.
    using (WordprocessingDocument doc = WordprocessingDocument.Open(path, false))
    {
        // Seems like we got an ok file.
    }
}
catch
{
    // Let your user know that they should upload a proper Word file.
}

但在此之前尝试进行MIME验证,它可以节省您尝试打开已知的不是有效文档的开销。