【问题标题】:Java servlet can't receive the parts of an http post multipart requestJava servlet 无法接收 http post 多部分请求的部分
【发布时间】:2015-09-18 16:22:52
【问题描述】:

首先,我问了这个问题What did I miss to send a http part post request,似乎我不明白从客户端向服务器发送多部分的逻辑。使用这个帖子https://developer.constantcontact.com/docs/mylibrary-files-api/file-add-multipart-post.html我无法看到每个部分的必填字段。

我构建了我的请求并添加了您在此处看到的所有必填字段

HttpClient client = HttpClientBuilder.create().build();
        HttpPost httpPost = new HttpPost(
                "http://localhost:8080/ServletExample1/multipart1");
        httpPost.addHeader("Content-Type",
                "multipart/related; boundary=HereItGoes");
        httpPost.addHeader("Accept", MediaType.TEXT_PLAIN);
        MultipartEntityBuilder builder = MultipartEntityBuilder.create();
        FileBody bin = new FileBody(new File("./test.txt"));
        builder.addPart("source", new StringBody("MyComputer",
                ContentType.TEXT_PLAIN));
        builder.addPart("folder_id", new StringBody("-1",
                ContentType.TEXT_PLAIN));
        builder.addPart("file_type", new StringBody("txt",
                ContentType.TEXT_PLAIN));
        builder.addPart("file_name", new StringBody("test.txt",
                ContentType.TEXT_PLAIN));
        builder.addPart("description", new StringBody("The file to test",
                ContentType.TEXT_PLAIN));
        builder.addPart("data", bin);
        HttpEntity entity = builder.build();
        httpPost.setEntity(entity);
        HttpResponse response = client.execute(httpPost);
        String responseString = new BasicResponseHandler()
                .handleResponse(response);
        System.out.println(responseString);

我的问题出在服务器上,我一直收到零件数为零的消息。对于服务器未收到零件的某些人(请注意,我并不是说服务器中存在异常)

我这样说是因为我在服务器(我的 servlet)上这样做

Iterator<Part> partsIterator = request.getParts().iterator();
            System.out.println("The number of parts is :"
                    + request.getParts().size());

而且打印的结果总是零,总是

请问我错过了什么?

【问题讨论】:

    标签: java servlets http-post multipartform-data multipart


    【解决方案1】:

    Servlet 的多部分配置需要 Content-Typemultipart/form-data

    这是在javadoc of @MultipartConfig 中指定的其他地方

    可以在javax.servlet.Servlet 类上指定的注解, 表示Servlet 的实例期望符合的请求 到multipart/form-data MIME 类型。

    您指定了不同的内容类型

    httpPost.addHeader("Content-Type", "multipart/related; boundary=HereItGoes");
    

    摆脱这个。 MultipartEntityBuilder 已经构建了一个带有适当标头的请求。只需添加

    builder.setBoundary("HereItGoes")
    

    为边界。

    例如Servlet

    @WebServlet(loadOnStartup = 1, urlPatterns = "/multipart1")
    @MultipartConfig()
    public class MyServlet extends HttpServlet {
        @Override
        protected void doPost(HttpServletRequest request, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("The number of parts is :" + request.getParts().size());
            Iterator<Part> partsIterator = request.getParts().iterator();
            while (partsIterator.hasNext()) {
                System.out.println(partsIterator.next().getName());
            }
        }
    }
    

    它将收到您发送的所有 6 个部分以及问题中的代码。

    【讨论】:

    • Brilliant 您的答案完美无缺的好处是,坏事是我似乎不必指定所有这些信息,如描述、文件名、文件类型、来源和数据。对?因为我在那里更改了名称并且请求仍然有效,我可以读取服务器上的新属性。你能告诉我任何链接或教程页面来解析服务器中的文件吗?另外,我怎样才能发送很多部分:) 你的代码只会发送一个部分。
    • @MarcoDinatsoli 我不知道你的服务器在做什么,它是如何解析它的,它的期望是什么等等。我添加了一个示例 Servlet 接收所有部分。
    猜你喜欢
    • 1970-01-01
    • 2012-03-24
    • 2014-08-29
    • 2010-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-16
    • 1970-01-01
    相关资源
    最近更新 更多