我试图从html表单上传文本文件。
是否有关于如何从HttpHandler
答案 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();
}
}
}
}
答案 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线程执行解析。