Razor 页面 IFormFile .Net 5.0 附件头验证

问题描述

我使用 .Net 5.0 (Razor Pages) 和 IFormFile 上传用户图像,在 ASP.NET 中我用来验证文件标题以确保上传文件有效,例如不更改 EXE将文件扩展名转换为 Jpg 并将其上传,以便帮助验证 IFormFile 的标题吗?

ASP.NET 中使用的函数:我需要在 Razor Pages 中实现

public string validateFiletoUpload(FileUpload objFile)
    {
        string errorMessagetoReturn = string.Empty;
        // DICTIONARY OF ALL IMAGE FILE HEADER
        Dictionary<string,byte[]> imageHeader = new Dictionary<string,byte[]>();
        imageHeader.Add("JPG",new byte[] { 0xFF,0xD8,0xFF,0xE0 });
        imageHeader.Add("JPEG",0xE0 });

        imageHeader.Add("PDF",new byte[] { 0x25,0x50,0x44,0x46 });
        imageHeader.Add("DOCX",new byte[] { 0x50,0x4B,0x03,0x04 });
        imageHeader.Add("DOC",new byte[] { 0xD0,0xCF,0x11,0xE0 });
        imageHeader.Add("MSG",0xE0,0xA1,0xB1,0x1A,0xE1 });

        byte[] header;

       
        string fileExt;
        fileExt = objFile.FileName.Substring(objFile.FileName.LastIndexOf('.') + 1).toupper();

       
        byte[] tmp;
        try
        {
            tmp = imageHeader[fileExt];
            header = new byte[tmp.Length];
        }
        catc
        {
            errorMessagetoReturn = "Invalid File.";
            return errorMessagetoReturn;
        }
        

        
        objFile.FileContent.Read(header,header.Length);

        if (CompareArray(tmp,header))
        {
            errorMessagetoReturn = string.Empty;
        }
        else
        {
            errorMessagetoReturn = "Invalid ." + fileExt + " file.";
            
        }

        return errorMessagetoReturn;
    }

    private bool CompareArray(byte[] a1,byte[] a2)
    {
        if (a1.Length != a2.Length)
            return false;

        for (int i = 0; i < a1.Length; i++)
        {
            if (a1[i] != a2[i])
                return false;
        }

        return true;
    }

解决方法

使用下面代替 objFile.FileContent.Read(header,header.Length) 解决了;

if (objFile.Length > 0)
            {
                using (var ms = new MemoryStream())
                {
                    objFile.CopyTo(ms);
                    var fileBytes = ms.ToArray();

                for (int i = 0; i < header.Length; i++)
                {
                    header[i] = fileBytes[i];
                }
                
                }
            }