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

Posted

技术标签:

【中文标题】使用 Undertow 的多部分表单数据示例【英文标题】:Multipart form-data example using Undertow 【发布时间】:2016-10-16 19:17:20 【问题描述】:

我正在尝试从 html 表单上传文本文件。

有没有关于如何从HttpHandler 获取文本文件的示例

【问题讨论】:

【参考方案1】:

我曾经使用过以下代码:

    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

【讨论】:

【参考方案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();

【讨论】:

【参考方案3】:

这就是我所做的:

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();
                     
                
            
        
    

来自文档:

void parse(HttpHandler next) 抛出异常

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

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

【讨论】:

以上是关于使用 Undertow 的多部分表单数据示例的主要内容,如果未能解决你的问题,请参考以下文章

具有特定 JSON 要求的多部分表单数据 POST

使用spring boot在undertow中禁用http TRACK/TRACE

使用Android到Objective - C的多部分表单数据(NSDictionary和图像)

Jersey API中的多部分/表单数据出现CORS错误

警告:第 0 行未知中的多部分/表单数据 POST 数据中缺少边界

解析Servlet中传入的多部分/表单数据参数的便捷方法[重复]