关于Java:Servlet是否可以确定发布的数据是否为multipart / form-data?

关于Java:Servlet是否可以确定发布的数据是否为multipart / form-data?

Can a servlet determine if the posted data is multipart/form-data?

我有一个Servlet,用于Front Controller模式中的许多不同操作。 有谁知道是否有可能判断回传给它的数据是否为enctype =" multipart / form-data"? 在做出决定之前,我无法读取请求参数,因此无法将请求分派给适当的控制器。

有任何想法吗?


如果要尝试使用上面介绍的request.getContentType()方法,请注意:

  • request.getContentType()可能返回null。
  • request.getContentType()可能不等于" multipart / form-data",而只能以它开头。
  • 考虑到这一点,您应该运行的检查是:

    1
    2
    3
    if (request.getContentType() != null && request.getContentType().toLowerCase().indexOf("multipart/form-data") > -1 ) {
    // Multipart logic here
    }

    是的,用户代理请求中的Content-type标头应包含(至少)HTML4规范中所述的multipart/form-data

    http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.2


    您可以调用一个方法来获取内容类型。

    http://java.sun.com/j2ee/sdk_1.3/techdocs/api/javax/servlet/ServletRequest.html#getContentType()

    根据http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.2,内容类型将为" multipart / form-data"。

    不要忘记:

  • request.getContentType()可能返回null。

  • request.getContentType()可能不等于" multipart / form-data",而只能以它开头。

  • 因此,请牢记所有这些:

    1
    2
    3
    4
    5
    if (request.getContentType() != null &&
        request.getContentType().toLowerCase().indexOf("multipart/form-data") > -1 )
    {
        << code block >>
    }

    ServletFileUpload实现isMultipartContent()。也许您可以根据需要提高此实现(相对于创建ServletFileUpload的开销)。

    http://www.docjar.com/html/api/org/apache/commons/fileupload/servlet/ServletFileUpload.java.html


    为了扩展awm129的答案-Apache commons的实现与此对应:

    1
    2
    3
    4
    5
    if (request != null
            && request.getContentType() != null
            && request.getContentType().toLowerCase(Locale.ENGLISH).startsWith("multipart/")) {
        ...
    }

    您可以使用Apache Commons的org.apache.commons.lang3.StringUtils来简化它:

    1
    2
    3
    if (StringUtils.startsWithIgnoreCase(request.getContentType(),"multipart/")) {
        ...
    }

    您必须至少在某种程度上读取请求参数才能确定该参数。 ServletRequest类具有您要查看的getContentType方法。


    https://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpServletRequest.html#getParts()

    java.util.Collection getParts()

    抛出:
    ServletException-如果此请求的类型不是multipart / form-data


    推荐阅读