【问题标题】:Is it possible to know if the type of the uploaded file is an image?是否可以知道上传文件的类型是否为图像?
【发布时间】:2010-11-07 23:52:33
【问题描述】:

用户上传文件时,是否可以知道上传的文件是不是图片,

我愿意接受任何解决方案,客户端、服务器端或两者兼而有之,我们会根据情况进行选择。

【问题讨论】:

    标签: asp.net javascript image file-upload


    【解决方案1】:

    是的,通过检查文件的magic number。

    【讨论】:

      【解决方案2】:

      也许您可以使用以下代码来检查文件是否为图像。

      public bool IsFileAnImage(string filePath)
      {
         try
         {
            Image image = Image.FromFile(filePath))
         }
         catch
         {
            return false;   
         }
         finally
         {
            image.Dispose();
         }
      
         return true;
      }
      

      【讨论】:

        【解决方案3】:

        这可以通过 GD 使用以下函数在服务器端完成:((modified version of this)

        function imageFileTypeFromBinary($file)
        {
        
            $binary = file_get_contents($file);
        
            if (
                !preg_match(
                    '/\A(?:(\xff\xd8\xff)|(GIF8[79]a)|(\x89PNG\x0d\x0a)|(BM)|(\x49\x49(\x2a\x00|\x00\x4a))|(FORM.{4}ILBM))/',
                    $binary, $hits
                )
            ) {
                return 'application/octet-stream';
                    //return false;
        
            }
            static $type = array (
                1 => '.jpeg',
                2 => '.gif',
                3 => '.png',
                4 => '.x-windows-bmp',
                5 => '.tiff',
                6 => '.x-ilbm',
            );
            return $type[count($hits) - 1];
            // or simply return true
            // return true;
        }
        

        如果你愿意,你可以让它返回 true 或 false,而不是 mime 类型。

        【讨论】:

          【解决方案4】:

          一种简单的方法是查看文件的扩展名。

          【讨论】:

          • 除了扩展名之外什么也没告诉你;并且是网站错误地允许上传可执行文件的常见方式。
          • 我确实说过“简单”,而不是万无一失,但我建议即使您担心用户会撒谎,文件扩展名也很有价值。如果用户将 virus.exe 重命名为 funpic.gif,则该扩展程序是在做出虚假承诺。但是,由于它声称是 gif,因此我们可以专门测试它是否真的是,否则拒绝它。否则,我们将不得不穷尽所有可能性。
          • 我应该补充一点,重命名扩展可以使危险文件无害。例如,一个破坏文件系统的*.VBS文件在重命名为*.TXT时只是有趣的阅读。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-07-03
          • 2012-03-03
          • 2012-10-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多