使用 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 的多部分表单数据示例的主要内容,如果未能解决你的问题,请参考以下文章
使用spring boot在undertow中禁用http TRACK/TRACE
使用Android到Objective - C的多部分表单数据(NSDictionary和图像)