如何在JSP中解析multipart / form-data参数?

时间:2014-05-07 23:39:00

标签: jsp file-upload

在尝试从JSP中获取请求中的参数时,出于某种原因我们无法使用servlet。

我想在JSP页面中模拟servlet行为(doPost,doGet,doPut等),我们有很多。类似的东西:

JSP文件:

    <%
        new SomeClass(request, response).doRequest();
    %>
    < !--HTML-->

我知道我可以使用request.getMethod()获取请求方法,解析request.getQueryString()的GET参数,以及解析request.getReader()中数据的正文。

但是从表格

提交时,身体看起来像这样


------WebKitFormBoundaryklIJzgCDUQ00bFB8
Content-Disposition: form-data; name="a"

123
------WebKitFormBoundaryklIJzgCDUQ00bFB8
Content-Disposition: form-data; name="b"

456
------WebKitFormBoundaryklIJzgCDUQ00bFB8
Content-Disposition: form-data; name="c"; filename="text.txt"
Content-Type: text/plain

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris sed erat justo. Vestibulum id dui felis. Donec sagittis, nibh sit amet interdum dignissim, magna velit pulvinar odio, ut ornare dui nunc et quam. Sed vel lorem vestibulum, semper libero a, aliquet nunc. Praesent urna tortor, euismod nec dolor hendrerit, scelerisque vehicula nisl. Nunc a interdum mi, sed rhoncus elit. Sed nec lacus ultrices, dictum tellus sed, aliquam arcu. In pretium imperdiet dui, et rutrum ipsum commodo sit amet. Aliquam cursus metus ac imperdiet aliquam.
------WebKitFormBoundaryklIJzgCDUQ00bFB8--

因此解析起来并不容易。

然后在那个类中我将分别拥有GET参数和body参数,请求方法和文件可能。

是否有可以从请求对象中解析的实用程序,类,框架,或者您可以给我的任何建议。

我并不反对使用servlet,但我们已经创建了很多JSP文件,我们必须为每个文件指定一个servlet路径,例如/posts

3 个答案:

答案 0 :(得分:0)

request.getParameter("a")可以同时执行G​​ET和POST。在EL(表达式语言)中:${param.a}可放置在HTML中。

文件uplpad取决于它是如何实现的(不同的可能性)。您可以检查WEB-INF/web.xml

答案 1 :(得分:0)

您应该使用request.getParameter(请参阅javadoc)和/或getParameterNamesgetParameterValuesgetParameterMap来访问查询字符串(GET)和表单body(POST)参数。

解析查询字符串和/或表单正文几乎不是正确的事情。

没有任何关于JSP的东西应该阻止你以与servlet相同的方式处理它。

答案 2 :(得分:0)

我最终根据RequestType手动解析请求:

String contentType = getContentType();
if(contentType == null){
    reader = request.getReader();
} else if (contentType.startsWith("multipart/")) {
    getMultipartParameters();
} else if (contentType.startsWith("application/x-www-form-urlencoded")) {
    getNameValueParameters();
} else {
    reader = request.getReader();
}

如果类型是其他类型,我会获得对请求阅读器的引用以便稍后进行解析。

如果它是multipart,我用Apache Commons FileUpload解析它。如果它是form-urlencoded,我从正文中解析一个名称 - 值字符串。

private void getMultipartParameters(){
        FileItemFactory factory = new DiskFileItemFactory();
        ServletFileUpload upload = new ServletFileUpload(factory);
        try {
            for (FileItem fi : upload.parseRequest(request)) {
                if(fi.isFormField()){
                    Funciones.putInArrayMap(POST, fi.getFieldName(), fi.getString());
                } else {
                    Funciones.putInArrayMap(FILES, fi.getFieldName(), fi);
                }
            }
        } catch(FileUploadException e){
            Log.write(e);
        }
}

_

private void getNameValueParameters(){
    try {
        StringBuilder sb = new StringBuilder();
        BufferedReader br = request.getReader();
        String line = br.readLine();
        while(line != null){
            sb.append(line);
            line = br.readLine();
        }
        POST = Funciones.getQueryMap(sb.toString(), getCharset());
    } catch (IOException ex) {
        Log.write(ex);
    }
}

_

private void getParameters(){
    String qs = request.getQueryString();
    GET = Funciones.getQueryMap(qs, getCharset());
}

在所有情况下,我使用相同的名称 - 值代码解析查询字符串。

所有这些都保存在这些变量中:

protected Map<String, List<String>> GET = new HashMap<>();
protected Map<String, List<String>> POST = new HashMap<>();
protected Map<String, List<FileItem>> FILES = new HashMap<>();

我仍然愿意接受更好的方法。