C# 文件上载asp.net

C# 文件上载asp.net,c#,asp.net,C#,Asp.net,在ASP.NET中验证文件上载控件中的文件格式的最佳方法是什么? 实际上,我希望用户只上传特定格式的文件。虽然我通过检查文件名来验证它,但我正在寻找另一种解决方案来解决这个问题。唯一可以确保的方法是根据文件格式的规范实际解析整个文件,并检查所有内容是否符合要求 如果您只想进行基本检查,大多数二进制文件格式都有某种形式的头或开头,您可以检查。您可以使用这样的组件限制用户在上载之前可以选择哪种类型的文件。尝试以下代码,从文件中读取前256个字节,并使用内部dll(urlmon.dll)返回文件的mi

在ASP.NET中验证文件上载控件中的文件格式的最佳方法是什么?
实际上,我希望用户只上传特定格式的文件。虽然我通过检查文件名来验证它,但我正在寻找另一种解决方案来解决这个问题。

唯一可以确保的方法是根据文件格式的规范实际解析整个文件,并检查所有内容是否符合要求


如果您只想进行基本检查,大多数二进制文件格式都有某种形式的头或开头,您可以检查。

您可以使用这样的组件限制用户在上载之前可以选择哪种类型的文件。

尝试以下代码,从文件中读取前256个字节,并使用内部dll(urlmon.dll)返回文件的mime类型。然后比较文件的mime类型和解析后返回的mime类型

     using System.Runtime.InteropServices; ...

           [DllImport(@"urlmon.dll", CharSet = CharSet.Auto)]
           private extern static System.UInt32 FindMimeFromData(
           System.UInt32 pBC,
           [MarshalAs(UnmanagedType.LPStr)] System.String pwzUrl,
           [MarshalAs(UnmanagedType.LPArray)] byte[] pBuffer,
           System.UInt32 cbSize,
           [MarshalAs(UnmanagedType.LPStr)] System.String pwzMimeProposed,
           System.UInt32 dwMimeFlags,
           out System.UInt32 ppwzMimeOut,
           System.UInt32 dwReserverd
         );

         public string getMimeFromFile(string filename)
         {
          if (!File.Exists(filename))
             throw new FileNotFoundException(filename + " not found");

            byte[] buffer = new byte[256];
            using (FileStream fs = new FileStream(filename, FileMode.Open))
            {
              if (fs.Length >= 256)
                  fs.Read(buffer, 0, 256);
              else
                 fs.Read(buffer, 0, (int)fs.Length);
           }
      try
      {
          System.UInt32 mimetype;
          FindMimeFromData(0, null, buffer, 256, null, 0, out mimetype, 0);
          System.IntPtr mimeTypePtr = new IntPtr(mimetype);
          string mime = Marshal.PtrToStringUni(mimeTypePtr);
          Marshal.FreeCoTaskMem(mimeTypePtr);
          return mime;
     }
     catch (Exception e)
     {
         return "unknown/unknown";
     }
    }
但是在不同的浏览器中检查类型,因为mimetype在不同的浏览器中可能不同

此外,即使您通过编辑文件名更改了扩展名,也会给出准确的mimetype


希望这对您有所帮助…

您打算接受哪种格式?我想上传数据包跟踪文件.pkt抱歉,但我希望能从客户那里得到验证。@Shoaib,我也搜索了一些与您要求类似的东西,但找不到。最后,我只检查了客户端的扩展,并使用上面的代码进行了服务器端验证。urlmon.dll是dotnet库中的一个内部dll,只需将其引用添加到所有。我喜欢使用正则表达式验证程序并检查扩展名模式是否匹配的简单解决方案:)@Shoaib,请参阅,检查文件扩展名很简单。但是,如果你上传了一个无效的文件,通过简单的重命名将其扩展名更改为有效的扩展名,那么你的验证就会失败。如果将上述服务器端验证与客户端验证一起添加,则会通过更改扩展名来防止上载无效文件。现在我希望你明白为什么会这样做。。