[英]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.