簡體   English   中英

使用 Undertow 的多部分表單數據示例

[英]Multipart form-data example using Undertow

我正在嘗試從 html 表單上傳文本文件。

有沒有關於如何從HttpHandler獲取文本文件的例子

我曾經使用過以下代碼:

    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

您可以使用內置的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();

這就是我所做的:

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 線程執行解析。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM