当前位置: 首页 > 面试题库 >

如何查看上传的文件是图片还是其他文件?

松建本
2023-03-14
问题内容

在我的Web应用程序中,我有一个图像上传模块。我想检查上传的文件是图像文件还是其他文件。我在服务器端使用Java。

图像BufferedImage在Java中读取,然后将其写入磁盘ImageIO.write()

我应该如何检查BufferedImage,究竟是图像还是其他?

任何建议或链接将不胜感激。


问题答案:

我假设您正在servlet上下文中运行它。如果仅根据文件扩展名检查内容类型是可以承受的,则可使用ServletContext#getMimeType()来获取mime类型(内容类型)。只需检查它是否以开头image/

String fileName = uploadedFile.getFileName();
String mimeType = getServletContext().getMimeType(fileName);
if (mimeType.startsWith("image/")) {
    // It's an image.
}

默认的mime类型在所讨论的servlet容器中定义web.xml。例如在Tomcat中,它位于中/conf/web.xml。您可以在/WEB- INF/web.xmlwebapp的中扩展/覆盖它,如下所示:

<mime-mapping>
    <extension>svg</extension>
    <mime-type>image/svg+xml</mime-type>
</mime-mapping>

但这并不能阻止您通过更改文件扩展名来欺骗您。如果您也想解决这个问题,那么您还可以根据 实际
文件内容确定mime类型。如果仅检查BMP,GIF,JPG或PNG类型(而不是TIF,PSD,SVG等)负担得起,那么您可以直接将其输入ImageIO#read()并检查它是否不会引发异常。

try (InputStream input = uploadedFile.getInputStream()) {
    try {
        ImageIO.read(input).toString();
        // It's an image (only BMP, GIF, JPG and PNG are recognized).
    } catch (Exception e) {
        // It's not an image.
    }
}

但是,如果您还想涵盖更多图像类型,请考虑使用3rd
party库,该库通过嗅探文件头来完成所有工作。例如JMimeMagic或Apache
Tika
,它们同时支持BMP,GIF,JPG,PNG,TIF和PSD(但不支持SVG)。Apache
Batik支持SVG。下面的示例使用JMimeMagic:

try (InputStream input = uploadedFile.getInputStream()) {
    String mimeType = Magic.getMagicMatch(input, false).getMimeType();
    if (mimeType.startsWith("image/")) {
        // It's an image.
    } else {
        // It's not an image.
    }
}

如果有必要,您可以组合使用并且胜过一个。

也就是说,您不一定需要ImageIO#write()将上传的图像保存到磁盘。只需将获得的内容InputStream直接写成一种PathOutputStream类似FileOutputStream的Java
IO方式就足够了

try (InputStream input = uploadedFile.getInputStream()) {
    Files.copy(input, new File(uploadFolder, fileName).toPath());
}

当然,除非您想收集一些图像信息,例如其尺寸和/或想要对其进行处理(裁剪/调整大小/旋转/转换/等)。



 类似资料:
  • 问题内容: 除了检查每个可能的扩展名外,我如何检查文件是mp3文件还是图像文件? 问题答案: 您可以使用来识别图像文件。 要查找有关MP3和其他音频/视频文件的更多信息,建议使用 php- mp4info getID3() 。

  • 问题内容: 我进行某种形式的验证,以确保用户上传的文件的类型正确。但是上载是可选的,因此如果他没有上载任何内容并提交了表单的其余部分,我想跳过验证。我如何检查他是否上传了东西?会工作吗? 问题答案: 您可以使用: 从文档: 如果以filename命名的文件是通过HTTP POST上传的,则返回TRUE。这有助于确保恶意用户没有试图诱使该脚本在不应该对其运行的文件上工作,例如/ etc / pass

  • 问题内容: 我想检查上传的文件是图像文件(例如png,jpg,jpeg,gif,bmp)还是其他文件。问题是,无论您上传哪种文件类型,我都使用Uploadify上传文件,这会更改mime类型并给出“文本/八进制”或类似的mime类型。 除了使用PHP检查文件扩展名之外,是否有其他方法可以检查上传的文件是否为图像? 问题答案: 您可以使用非图像尺寸返回零。

  • 我想检查路径是文件还是目录。如果是目录,那么将目录和文件分别记录下来。稍后我想将它们作为json对象发送。 nodejs binding.lstat(PathModule._Makelong(路径)) 更新:找到解决方案。我必须这样添加testFolder+文件:

  • 问题内容: 我正在尝试上传以表格形式发送的文件。我正在尝试使用php,但是在html和php之间我使用JS和Jquery和ajax(因为我不想重新加载页面)。我在$ _FILES方面遇到麻烦。 在这里,我正在使用带有javascript操作(action =“ javascript:SendPresupMail();”)的表单(包含文件输入)。 在该JS函数中,我使用了一个小Jquery和ajax

  • 本文向大家介绍asp.net文件上传解决方案(图片上传、单文件上传、多文件上传、检查文件类型),包括了asp.net文件上传解决方案(图片上传、单文件上传、多文件上传、检查文件类型)的使用技巧和注意事项,需要的朋友参考一下 小编之前也介绍了许多ASP.NET文件上传的解决案例,今天来个asp.net文件上传大集合。 1 使用标准HTML来进行图片上传 前台代码: 后台代码: 2 单文件上传 这是最