栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

我假设您正在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.xml
webapp的中扩展/覆盖它,如下所示:

<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
直接写成一种
Path
OutputStream
类似
FileOutputStream
的Java
IO方式就足够了

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

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



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/507073.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号