【问题标题】:How to know what image type user submitted in form?如何知道用户在表单中提交的图像类型是什么?
【发布时间】:2010-07-20 21:43:11
【问题描述】:

我允许我的用户上传头像图片(谷歌应用引擎、java)。我不知道他们上传时是什么图像类型。我只是在他们的提交表格中存储他们给我的任何东西。我在这里遵循示例:

http://code.google.com/appengine/docs/python/images/usingimages.html

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

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

 resp.setHeader("Content-Type", "image/jpg");   

我正在使用java,

谢谢

【问题讨论】:

    标签: java google-app-engine servlets


    【解决方案1】:

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

    Image img = ImagesServiceFactory.makeImage(uploadedBytes);
    String contentType = "image/" + img.getFormat().toString().toLowerCase();
    

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

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

    【讨论】:

    • +1 表示我不知道的 GAE API。这是要走的路(而不是我建议的 JMimeMagic)。
    • 很酷,是的,每当用户提交照片以将其重新缩放为缩略图时,我都会使用图像 api,因此在此步骤中,我将图像类型取出并按上述方式存储。
    【解决方案2】:

    如果可以根据文件扩展名检查内容类型,请使用ServletContext#getMimeType()

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

    默认的 mime 类型在相关 servlet 容器的 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>
    

    但这并不能阻止您通过更改文件扩展名来欺骗您的用户。如果您也想涵盖这一点,那么您还可以根据 实际 文件内容确定 mime 类型。您可以通过嗅探file headers 来做到这一点。考虑使用 3rd 方库来完成所有工作。我发现 JMimeMagic 对此很有用。您可以按如下方式使用它:

    String mimeType = Magic.getMagicMatch(uploadedFile, false).getMimeType();
    

    为了能够返回图像,您只需将响应内容类型设置为结果为ServletContext#getMimeType()(不要忘记在上传过程中确认这等于 JMimeMagic 返回的内容,以防出现这种情况) .

    response.setContentType(getServletContext().getMimeType(file.getName()));
    

    【讨论】:

      【解决方案3】:

      你为什么不直接从文件名中获取扩展名,并使用它来确定它是什么类型的图像,并从中计算出 MIME 类型?

      另一种方法是使用谷歌应用引擎图像处理 API 使用不同的文件类型打开您的图像,并检查哪个不会导致错误。这会更占用 CPU,但更可靠。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-09
        • 2011-08-16
        • 1970-01-01
        • 1970-01-01
        • 2011-08-04
        • 1970-01-01
        相关资源
        最近更新 更多