文件上传asp.net

时间:2011-07-09 21:02:13

标签: c# asp.net

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

3 个答案:

答案 0 :(得分:1)

唯一可以确定的方法是根据文件格式的规范实际解析整个文件,并检查一切是否合适。

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

答案 1 :(得分:1)

尝试以下代码从文件读取前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。

希望这可以帮助你...

答案 2 :(得分:0)

您可以使用像Uploadify这样的组件来限制用户在上传之前可以选择的文件类型。