1

我想检测 Http-Request 是否是文件上传。我知道,有一个视图可能表明文件上传:

  • 请求方法:如果是 POST,通常有一个消息体。但我知道,也可以使用 GET 请求发送内容。是否也可以使用 GET 请求上传文件?
  • content-type:我猜,content-type 字段通常是设置的,file-upload-message。但是文件上传的内容类型是什么?
  • content-length:应该为文件上传设置 content-length 字段。

有一个视图问题离开:

如何区分文件上传和普通的 html 形式的帖子?浏览器是否使用分块编码进行文件上传?(据我所知,那是没有意义的,但我知道的不多)

4

2 回答 2

2

通常可以通过检查请求是否为multipart来检测。

以下示例代码是来自Apache Commons FileUpload 库的 c&p

/**
 * Utility method that determines whether the request contains multipart
 * content.
 *
 * @param request The servlet request to be evaluated. Must be non-null.
 *
 * @return <code>true</code> if the request is multipart;
 *         <code>false</code> otherwise.
 */
public static final boolean isMultipartContent(
        HttpServletRequest request) {
    if (!"post".equals(request.getMethod().toLowerCase())) {
        return false;
    }
    String contentType = request.getContentType();
    if (contentType == null) {
        return false;
    }
    if (contentType.toLowerCase().startsWith(MULTIPART)) {
        return true;
    }
    return false;
}

其中 MULTIPART 是

/**
 * Part of HTTP content type header.
 */
public static final String MULTIPART = "multipart/";
于 2013-04-09T01:32:12.087 回答
0

检查多部分表单提交只是让您通过前门。问题是,您可以有一个实际上不包含文件上传的多部分表单提交。如果你想知道你是否真的有上传的文件,你需要搜索表单部分。像这样:

public static int getUploadCount(HttpServletRequest request) throws Exception {
    int fileCt = 0;
    String[] tokens;
    String contentDisp;
    String fileName;
    // Search through the parts for uploaded files
    try{
        for (Part part : request.getParts()) {
            fileName = "";
            contentDisp = part.getHeader("content-disposition");
            // System.out.println("content-disposition header= "+contentDisp);
            tokens = contentDisp.split(";");
            for (String token : tokens) {
                if (token.trim().startsWith("filename")) {
                    fileName = token.substring(
                        token.indexOf("=") + 2, 
                        token.length() - 1
                    );
                }
            }

            if (!fileName.equals("")) {
                fileCt++;
            }
        }
    } catch (ServletException ex) {
        throw new Exception(ex);
    }
    return fileCt;
}
于 2018-05-17T19:07:07.747 回答