无法在 XPage ServiceBean 中获取 multipart/form-data POST 请求正文的句柄

Unable to get a handle on the body of a multipart/form-data POST request in XPage ServiceBean

我有一个基于 bootstrap 框架的 xpage,它使用 jQuery $post 提交页面中包含的表单。这些使用 multipart/form-data 内容类型得到 posted,所以我无法控制它。我已经设置了一个 REST.xsp 包含一个调用 java ServiceBean 的 RESTService。我试过的最新方法如​​下:

private void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
    // TODO Auto-generated method stub
    
    try{
        ServletFileUpload upload = new ServletFileUpload();
        FileItemIterator iterator = upload.getItemIterator(request);
        System.out.println("test");
        while (iterator.hasNext()) {
             System.out.println("test2");
            FileItemStream item = iterator.next();
            InputStream stream = item.openStream();

            if (item.isFormField()) {
                byte[] str = new byte[stream.available()];
                stream.read(str);
                String pFieldValue = new String(str,"UTF8");
                
                
                System.out.println("text Value : "+pFieldValue);
                

                if(item.getFieldName().equals("textBoxFormElement")){
                    System.out.println("text Value : "+pFieldValue);
                }
              }
            }
    }catch (Exception e) {
        e.printStackTrace();
    }
    
}

但我似乎无法让服务器获取已发布的表单数据。我可以在控制台上看到“测试”,但它没有命中“test2”。

我已经尝试了所有我能找到的建议,包括:

    try {
         
            InputStream inputStream = request.getInputStream(); 
            Reader inputStreamReader = new InputStreamReader(inputStream);
            String allChars = "";
            System.out.println("test");
            int data = inputStreamReader.read();
            while(data != -1){
                System.out.println("test2");
                char theChar = (char) data;
                System.out.println(theChar);
                allChars = allChars + theChar;
                data = inputStreamReader.read();
            }

            inputStreamReader.close();
            
            
              
          }
         catch (IOException e) {
          System.out.println("No body data readable: " + e.getMessage() );
        }

(仍然没有“test2”)...并且:

    String requestBody = extractPostRequestBody(request);
    System.out.println(requestBody);


  private static String extractPostRequestBody(HttpServletRequest request) {
    Scanner s = null;

    try {
        s = new Scanner(request.getInputStream(), "UTF-8").useDelimiter("\A");
    } catch (IOException e) {
        e.printStackTrace();
    }
    return s.hasNext() ? s.next() : "";
}

(控制台未打印任何内容)。

我也尝试过使用 REST 客户端 post 一些多部分表单数据值到 URL 但同样没有返回任何内容。但是,如果我尝试使用 application/json 内容类型发布一些 json 并使用上面显示的最后一种方法,我可以看到 json 被打印到控制台。

使用 extLib REST 控件和带有多部分 POST 的 java servicebean 是否可能存在一些问题?我知道您只能读取一次请求流,以便之前使用例如 request.properties 之后会使流变为空,但情况并非如此,并且可能 json 如果它也不会显示是。

非常感谢

如果 multipart/formdata 与 POST 请求一起发送到 ExtLib Rest 控件,您可以像这样获取提交数据的句柄:

for (Object e : req.getParameterMap().entrySet()) {
                
    Map.Entry entry = (Map.Entry) e;                
    System.out.println("got " + entry.getKey() + "/" + entry.getValue().getClass().getCanonicalName());
                
}

地图中的条目可以是表单域或上传的文件。