ServletFileUpload#的parseRequest(请求)返回一个空列表(Servlet

2019-07-05 07:28发布

我在Android的它采用了客户端应用程序HttpURLConnection将文件发送到服务器。 服务器使用Apache通用FileUpload API来解析该形状的数据值。

HttpURLConnection发送此请求:

-----------------------------4912995119421
Content-Disposition: form-data; name="deviceid"

9428103
-----------------------------4912995119421
Content-Disposition: form-data; name="countryid"

598
-----------------------------4912995119421
Content-Disposition: form-data; name="number"

98621360
-----------------------------4912995119421
Content-Disposition: form-data; name="file"; filename="2012-12-08 17.42.18.jpg"
Content-Type: image/jpeg

ÿØÿá1 Exif  II*    
      @      °      ª    
   ²              ¼       Ä   (       1    Ì   2    Ø          i‡    ì   %ˆ    \  n  SAMSUNG GT-S5360L H      H      S5360LUHLB1 2012:12:08 17:42:18  š‚    î  ?‚    ö  "ˆ       'ˆ    È    ?    0220?    þ  ?      ‘     ’    &  ’       
’    .        0100             @       °       >  £       ¤        ¤        ¤    6  ¤                     
   2012:12:08 17:42:18 2012:12:08 17:42:18    
     d               R98      0100                         (           ¤      T.      ÿØÿà JFIF      ÿÛ C @@ÿÛ 
-----------------------------4912995119421--

服务器代码:

    String contentType = request.getContentType();
    if ((contentType.indexOf("multipart/form-data") == -1)) {
        response.setStatus(HttpServletResponse.SC_NOT_FOUND);
        return;
    }


    long maxFileSize = (2 * 1024 * 1024);

    int maxMemSize = (2 * 1024 * 1024);

    DiskFileItemFactory factory = new DiskFileItemFactory();
    // maximum size that will be stored in memory
    factory.setSizeThreshold(maxMemSize);

    // Create a new file upload handler
    ServletFileUpload upload = new ServletFileUpload(factory);
    // maximum file size to be uploaded.

    upload.setSizeMax(maxFileSize);

    List fileItems = upload.parseRequest(request);
    Iterator i = fileItems.iterator();


    //leo primero todas las variables.

    int deviceID = 0;
    int countryID = 0;
    String phoneNumber = "";



    while (i.hasNext()) {
        FileItem fi = (FileItem) i.next();

        if (fi.isFormField()) {
            String variable = fi.getFieldName();
            if (variable.equals("deviceid")) {
                deviceID = Integer.parseInt(fi.getString());
            } else if (variable.equals("countryid")) {
                countryID = Integer.parseInt(fi.getString());
            } else if (variable.equals("number")) {
                phoneNumber = String.valueOf(Long.parseLong(fi.getString()));
            }

        }

    }

    if (deviceID == 0 || countryID == 0 || phoneNumber.equals("")) {
        response.setStatus(HttpServletResponse.SC_NOT_FOUND);
        return;
    }

的问题是在该行List fileItems = upload.parseRequest(request); 。 返回的列表是空的,我不能让表单数据值。

Answer 1:

它会在这一点上,如果你已经(隐含的)解析请求主体事先是空的。 HTTP请求体可以是读/解析仅一次 (作为客户端已经发送它只有一次,也不会多次发送它)。

请求主体将被隐式读取/解析,当你调用了以下任何一种方法的喂养要求通用FileUpload 之前

request.getParameter();
request.getParameterMap();
request.getParameterNames();
request.getParameterValues();
request.getReader();
request.getInputStream();

你需要绝对确保你没有任何调用这些方法事先(也检查所有的Servlet过滤器,以确保)。

如果您已经确保你不这样做,那么唯一的其他可能的原因是一个不正确的边界头和/或使用不正确的换行符(它真的是CR + LF,因此不单独LF)。 您可以在底部的具体和适当的例子使用java.net.URLConnection中的火灾和处理HTTP请求 ,下节“上传文件”。



Answer 2:

我想,我觉得这是图书馆,有文件上传库库Apache服务器的不兼容后,同样的问题,所以我删除存储库,库服务器Apache的进口。

imports:
import org.apache.tomcat.util.http.fileupload.FileItem;
import org.apache.tomcat.util.http.fileupload.disk.DiskFileItemFactory;
import org.apache.tomcat.util.http.fileupload.servlet.ServletFileUpload;

对不起,我的英语



Answer 3:

如果使用弹簧,检查是否有一个<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver" />在XML文件中。 还有一个功能

protected HttpServletRequest checkMultipart(HttpServletRequest request) throws MultipartException {
        if (this.multipartResolver != null && this.multipartResolver.isMultipart(request)) {
            if (request instanceof MultipartHttpServletRequest) {
                logger.debug("Request is already a MultipartHttpServletRequest - if not in a forward, " +
                        "this typically results from an additional MultipartFilter in web.xml");
            }
            else {
                return this.multipartResolver.resolveMultipart(request);
            }
        }
        // If not returned before: return original request.
        return request;
    }

“吃”的多项目。 它会导致一个3小时疼痛。



Answer 4:

我跑了这个问题为好,但我无法找到任何东西,特别是与读取请求对象。 我终于得到它通过删除此块的工作:

@MultipartConfig(
    location="/tmp", 
    fileSizeThreshold=1024*1024, 
    maxFileSize=1024*1024*5, 
    maxRequestSize=1024*1024*5*5
)

显然,当我一直想读通过的getParts()的要求,我忘了删除此。 我是一个有点新的爪哇,所以我不知道与ServletFileUpload#的parseRequest这种冲突。 无论如何,一旦我摆脱了它,在正确的parseRequest返回的数组。



Answer 5:

我的问题是我的Linux服务器上的Apache的context.xml包含上下文

allowCasualMultipartParsing="true"和我的HttpServlet包含

@MultipartConfig(fileSizeThreshold=1024*1024*2,maxFileSize=1024*1024*50,maxRequestSize=1024*1024*50)

我删除它,然后它的正常工作。 希望这会帮助你。



文章来源: ServletFileUpload#parseRequest(request) returns an empty list