【问题标题】:Java/ImageIO Validate format before reading the entire file?Java/ImageIO 在读取整个文件之前验证格式?
【发布时间】:2010-03-09 19:34:39
【问题描述】:

我正在开发一个允许用户上传图像的 Web 应用程序。 我关心的是文件的大小,特别是如果它们是无效格式。

我想知道 java(或第三方库)中是否有一种方法可以在读取整个文件之前检查允许的文件格式(jpg、gif 和 png)。

【问题讨论】:

  • 您使用什么来处理上传?公共文件上传?
  • 其实我用的是icefaces,当文件已经加载时,我得到了一个更抽象的调用。

标签: java javax.imageio


【解决方案1】:

如果您只希望支持几种类型的图像,您可以从(上传)图像开始,并在某些时候使用前几个字节来检查您是否希望继续上传。

前几个字节magic number可以识别很多图像格式。如果数字匹配你当然不知道文件是否有效,但它可以用来匹配扩展名和幻数以防止真的完全不对应。

查看this page 以查看一些检查 mime 类型的 Java。请阅读文档或源代码以检查任何给定的方法是否需要整个文件,或者是否可以对前几个字节进行操作。我没用过那些库:)

还可以查看this page,其中还列出了一些 java 库,以及一些检测所依据的论文。

如果你找到了你喜欢的东西,别忘了提供一些反馈!

【讨论】:

  • 很好的提示!我要检查一下。如果您找到相关内容,请告诉我
【解决方案2】:

您不需要 3rd 方库。你要写的代码很简单。

在您处理上传时,按扩展名过滤文件。这并不完美,但可以解决大多数情况。

但是,这意味着文件已经上传到服务器。您可以在客户端使用一些 javascript 来执行相同的操作 - 检查 file-upload 组件的值是否包含允许的文件类型 - .jpg.png 等。

【讨论】:

  • 正如你所说,这不会是“完美的。我有点担心恶意用户试图上传错误的文件
  • @Dani Cricco 你无法阻止它。即使有一个库可以检查文件的标头以查看它是否为 jpeg,恶意用户也可以伪造这些标头并做他们的事情。但这种情况很少见,相信我。
  • 我目前正在使用 ImageIO.read 创建一个 BufferedImage。如果文件无效,那么 ImageIO.red 应该会失败。问题是我不想将整个文件读入 BufferedImage,因为它可能非常大
  • @Dani:我没有很好的解决方案来满足您的要求(您的观点确实有效),但 ImageIO.read 也不一定足够。 ImageIO 可能会接受恶意图像,也可能会拒绝有效文件。我见过带有奇怪颜色配置文件的 JPEG 文件,它们在理论上是正确的,但在 Java 5 中被 ImageIO 拒绝并在 Java 6 中被接受。
  • 检查文件扩展名是一种完全不够的方法,尤其是。在用户要上传图片的网站上!!!我在这样一个站点工作,站点要求是上传的图片由于明显的磁盘空间原因被限制为 jpeg。您会惊讶于有多少普通大众认为将文件扩展名更改为 .jpg 会将文件转换为 jpeg 类型。
【解决方案3】:
function extensionsOkay(fval) {
    var extension = new Array();

    extension[0] = ".png";
    extension[1] = ".gif";
    extension[2] = ".jpg";
    extension[3] = ".jpeg";
    extension[4] = ".bmp";

    // No other customization needed.
    var thisext = fval.substr(fval.lastIndexOf('.')).toLowerCase();
    for(var i = 0; i < extension.length; i++) {
        if(thisext == extension[i]) { 
            $('#support-documents').hide();
            return true; }
    }

    // show client side error message
    $('#span.failed').show();
    return false;
}

【讨论】:

  • (几个月后......对不起,但我处理同样的问题)变量 fval 是什么?文件?你使用什么函数(例如getParameter)来获取这个变量?使用简单的“getParameter”它不起作用。谢谢。
猜你喜欢
  • 2010-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-06
  • 1970-01-01
相关资源
最近更新 更多