Java 如何知道用户在表单中提交的图像类型?

Java 如何知道用户在表单中提交的图像类型?,java,google-app-engine,servlets,Java,Google App Engine,Servlets,我允许我的用户上传头像图像(谷歌应用程序引擎,java)。我不知道他们上传的图像是什么类型的。我只是把他们给我的东西储存在提交表格里。我在这里举一个例子: 是否有办法在存储之前检查图像类型?例如,如果他们提交一个文本文件,我不想接受它 另外,在返回图像时如何更改内容类型?我需要知道它是什么图像类型,以便正确设置内容类型: resp.setHeader("Content-Type", "image/jpg"); 我用的是java 谢谢你为什么不把文件名的扩展名去掉,用它来确定它是什么类

我允许我的用户上传头像图像(谷歌应用程序引擎,java)。我不知道他们上传的图像是什么类型的。我只是把他们给我的东西储存在提交表格里。我在这里举一个例子:

是否有办法在存储之前检查图像类型?例如,如果他们提交一个文本文件,我不想接受它

另外,在返回图像时如何更改内容类型?我需要知道它是什么图像类型,以便正确设置内容类型:

 resp.setHeader("Content-Type", "image/jpg");   
我用的是java


谢谢

你为什么不把文件名的扩展名去掉,用它来确定它是什么类型的图像,然后从中找出mime类型呢


另一种方法是使用不同的文件类型使用google app engine图像处理API打开图像,并检查哪一种不会导致错误。这将更占用CPU,但更可靠。

为什么不直接从文件名中去掉扩展名,然后用它来确定图像的类型,并由此计算出mime类型


另一种方法是使用不同的文件类型使用google app engine图像处理API打开图像,并检查哪一种不会导致错误。这将更占用CPU,但更可靠。

如果可以根据文件扩展名检查内容类型,则使用

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

<mime-mapping>
    <extension>svg</extension>
    <mime-type>image/svg-xml</mime-type>
</mime-mapping>
String mimeType = Magic.getMagicMatch(uploadedFile, false).getMimeType();
为了能够返回图像,您只需使用
ServletContext#getMimeType()
的结果设置响应内容类型(在这种情况下,请不要忘记在上载过程中确认这等于JMimeMagic返回的内容)


如果可以根据文件扩展名检查内容类型,则使用

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

<mime-mapping>
    <extension>svg</extension>
    <mime-type>image/svg-xml</mime-type>
</mime-mapping>
String mimeType = Magic.getMagicMatch(uploadedFile, false).getMimeType();
为了能够返回图像,您只需使用
ServletContext#getMimeType()
的结果设置响应内容类型(在这种情况下,请不要忘记在上载过程中确认这等于JMimeMagic返回的内容)


通常,如果使用基于浏览器的文件上载,表单数据将包括文件名和根据文件扩展名推断的内容类型。然而,这并不能保证用户没有上传具有误导性扩展名的文件。要验证内容类型,可以使用:

支持的类型有BMP、GIF、ICO、JPEG、PNG和TIFF。其他任何事情都应该失败


这可能不言而喻,但您应该只在上传时检查内容类型,然后将其与图像一起存储;不要在每次下载请求时调用图像服务来查找类型。

通常,如果使用基于浏览器的文件上载,表单数据将包括文件名和从文件扩展名推断的内容类型。然而,这并不能保证用户没有上传具有误导性扩展名的文件。要验证内容类型,可以使用:

支持的类型有BMP、GIF、ICO、JPEG、PNG和TIFF。其他任何事情都应该失败


这可能不言而喻,但您应该只在上传时检查内容类型,然后将其与图像一起存储;不要调用图像服务来查找每个下载请求的类型。

+1对于我不知道的GAE API。这就是方法(而不是我建议的JMimeMagic)。酷,是的,每当用户提交照片以重新缩放缩略图时,我都会使用图像api,所以在这一步中,我会取出图像类型,并如上所述进行存储。+1表示我不知道的GAE api。这就是方法(而不是我建议的JMimeMagic)。酷耶,每当用户提交照片以重新缩放缩略图时,我都会使用图像api,所以在这一步中,我会取出图像类型,并按照上面提到的方式存储它。
Image img = ImagesServiceFactory.makeImage(uploadedBytes);
String contentType = "image/" + img.getFormat().toString().toLowerCase();