jfinal 4.9.01无法正确解析上传文件boundary的问题

使用 httpcomponents httpclient上传文件时客户端发送的 http Content-Type:

Content-Type: multipart/form-data; boundary=rxU1IcP2kHsJVF37W5_8tRtSlAnB-KIhGP; charset=UTF-8

jfinal 4.9.01 解析方法如下:

/**
 * Extracts and returns the boundary token from a line.
 * 
 * @return the boundary token.
 */
private String extractBoundary(String line) {
  // Use lastIndexOf() because IE 4.01 on Win98 has been known to send the
  // "boundary=" string multiple times.  Thanks to David Wall for this fix.
  int index = line.lastIndexOf("boundary=");
  if (index == -1) {
    return null;
  }
  String boundary = line.substring(index + 9);  // 9 for "boundary="
  if (boundary.charAt(0) == '"') {
    // The boundary is enclosed in quotes, strip them
    index = boundary.lastIndexOf('"');
    boundary = boundary.substring(1, index);
  }

  // The real boundary is always preceeded by an extra "--"
  boundary = "--" + boundary;

  return boundary;
}

无法正确解析出boundary,会带上“;charset=UTF-8”的内容。


解决方法1:

修改httpclient上传代码:注释编码设置的地方

MultipartEntityBuilder.create()
//.setCharset(Consts.UTF_8)
...

如上所示,注释掉 setCharset 那一行客户端发送的 Content-Type 就没有 "charset=UTF-8" 了,就可以正常上传了。


解决方法2:

重写jfinal中com.oreilly.servlet.multipart.MultipartParser代码,将方法extractBoundary改成如下代码即可完美解析boundary内容

/**
 * Extracts and returns the boundary token from a line.
 *
 * @return the boundary token.
 */
private String extractBoundary(String line) {
    // Use lastIndexOf() because IE 4.01 on Win98 has been known to send the
    // "boundary=" string multiple times.  Thanks to David Wall for this fix.
    String[] lines = line.split(";");
    for (String lin : lines) {
        int index = lin.lastIndexOf("boundary=");
        if (index == -1) {
            continue;
        }
        String boundary = lin.substring(index + 9);  // 9 for "boundary="
        if (boundary.charAt(0) == '"') {
            // The boundary is enclosed in quotes, strip them
            index = boundary.lastIndexOf('"');
            boundary = boundary.substring(1, index);
        }

        // The real boundary is always preceeded by an extra "--"
        boundary = "--" + boundary;
        return boundary;
    }
    return null;

}


评论区

热门反馈

扫码入社