使用Undertow的多部分表单数据示例

时间:2016-06-15 15:16:04

标签: java undertow

我试图从html表单上传文本文件。

是否有关于如何从HttpHandler

获取文本文件的示例

3 个答案:

答案 0 :(得分:3)

我曾经使用过以下代码:

    Builder builder = FormParserFactory.builder();

    final FormDataParser formDataParser = builder.build().createParser(exchange);
    if (formDataParser != null) {
        exchange.startBlocking();
        FormData formData = formDataParser.parseBlocking();

        for (String data : formData) {
            for (FormData.FormValue formValue : formData.get(data)) {
                if (formValue.isFile()) {
                    // process file here: formValue.getFile();
                } 
            }
        }
    }

基于:http://www.programcreek.com/java-api-examples/index.php?api=io.undertow.server.handlers.form.FormData

答案 1 :(得分:2)

您可以使用内置的 EagerFormParsingHandler 并链接处理程序,如下例所示。此处理程序将解析请求并将多部分文件存储到" java.io.tmpdir"系统属性定义的目录(默认情况下,但是可配置)。在句柄中,您可以找到该文件并根据需要进行处理。此外, EagerFormParsingHandler 会添加一个侦听器,以便在交换完成后立即从文件系统中删除任何已创建的文件。

    HttpHandler multipartProcessorHandler = (exchange) -> {
        FormData attachment = exchange.getAttachment(FormDataParser.FORM_DATA);
        FormData.FormValue fileValue = attachment.get("file").getFirst();
        Path file = fileValue.getPath();
    };

    Undertow server = Undertow.builder()
        .addHttpListener(8080, "localhost")
        .setHandler(
            new EagerFormParsingHandler(
                FormParserFactory.builder()
                    .addParsers(new MultiPartParserDefinition())
                    .build()
            ).setNext(multipartProcessorHandler)
        )
        .build();
    server.start();

答案 2 :(得分:0)

这就是我所做的:

public class HttpServer{

    public void start() throws IOException{

        Undertow server = Undertow.builder()
            .addHttpListener(8080, "0.0.0.0")
            .setHandler(new HttpHandler() {
                @Override
                public void handleRequest(HttpServerExchange exchange) throws Exception {
                    // Parses HTTP POST form data and passes it to a handler asynchronously 
                    FormDataParser parser = FormParserFactory.builder().build().createParser(exchange);
                    MyHandler handler = new MyHandler();
                    parser.parse(handler);
                }
            }).build();

        server.start();

    }

    private class MyHandler implements HttpHandler{
        @Override
        public void handleRequest(HttpServerExchange exchange) throws Exception {
            // Form data is stored here
            FormData formData = exchange.getAttachment(FormDataParser.FORM_DATA);
            // Iterate through form data
            for (String data : formData) {
                for (FormData.FormValue formValue : formData.get(data)) {
                    if (formValue.isFileItem()) {
                        // Process file here
                        File uploadedFile = formValue.getFileItem().getFile().toFile();
                    } 
                }
            }
        }
    }
}

从文档中:

无效解析(下一个HttpHandler) 引发异常

异步解析表单数据。如果无法读取所有数据 立即读取的侦听器将被注册,并且数据将 被读取线程解析。当此方法完成处理程序时 将被调用,并将数据附加在FORM_DATA下。

该方法可以直接调用下一个处理程序,也可以 委托IO线程执行解析。