undertow作为容器,怎么接收form-data请求数据和怎么上传图片

网上到处都是拿undertow跟jettytomcat比较的文章,但undertow用法的文章基本上没有,一大悲哀。。

在网上到处搜,总结一下接收form-data参数的方法,另外上传也同样实现了

创建服务

undertow.io
官网上的demo就可以

public class HelloWorldServer {
  public static void main(final String[] args) {
    Undertow server = Undertow.builder()
      .addHttpListener(8080, "localhost")
      .setHandler(new HttpHandler() {
        @Override
        public void handleRequest(final HttpServerExchange exchange) throws Exception {
          exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, "text/plain");
          exchange.getResponseSender().send("Hello World");
        }
      }).build();
    server.start();
  }
}

添加FormDataParser

稍微修改一下 HttpHandler

原链接文: https://tomoya92.github.io/2019/04/11/undertow-form-data-upload/

Undertow server = Undertow.builder()
  .addHttpListener(8080, "localhost")
  .setHandler(new HttpHandler() {
    @Override
    public void handleRequest(final HttpServerExchange exchange) throws Exception {
      FormDataParser parser = FormParserFactory.builder().build().createParser(exchange);
      FormData data = parser.parseBlocking();
      for (String d : data) {
        Deque<FormData.FormValue> formValues = data.get(d);
        // 判断formValue是不是文件
        if (formValues.getFirst().isFileItem()) {
          FormData.FileItem fileItem = formValues.getFirst().getFileItem();
          // 获取文件名,这种方式获取的是原文件名,带后缀的
          // 还可以从formValues.getFirst().getFileItem().getFile().getFileName()里获取文件名,不过这个文件名已经被重新命名了,而且还不带后缀
          String fileName = formValues.getFirst().getFileName();
          // 创建一个输出流,将文件保存到本地
          FileOutputStream fos = new FileOutputStream(new File("/Users/hh/git/github/pymvc/" + fileName));
          // 保存文件
          Files.copy(fileItem.getFile(), fos);
          fos.close();
          System.out.println(fileName);
        } else {
          System.out.println("参数名:" + d + " 值:" + formValues.getFirst().getValue());
        }
      }
      exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, "text/plain");
      exchange.getResponseSender().send("Hello World");
    }
  }).build();

测试

启动服务,使用postman发起一个post请求,请求内容类型是 form-data
,参数里添加一个文件的类型,选择一个文件,然后发送请求,会发现会报错

Caused by: java.lang.IllegalStateException: UT000035: Cannot get stream as startBlocking has not been invoked

翻译过来就是 无法获取流,因为尚未调用startBlocking
这时只需要在 HttpHandler
外再套一层 BlockingHandler
即可,如下

public class HelloWorldServer {
  public static void main(final String[] args) {
    Undertow server = Undertow.builder()
      .addHttpListener(8080, "localhost")
      .setHandler(new BlockingHandler(new HttpHandler() {  } )).build();
    server.start();
  }
}

再次发送请求就没问题了

参考

  • https://stackoverflow.com/questions/37839418/multipart-form-data-example-using-undertow

博客不易,转载请保留原文链接,谢谢!

原文链接:

原文 

https://tomoya92.github.io/2019/04/11/undertow-form-data-upload/

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » undertow作为容器,怎么接收form-data请求数据和怎么上传图片

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址