undertow作為容器,怎麼接收form-data請求資料和怎麼上傳圖片
網上到處都是拿undertow跟jetty、tomcat比較的文章,但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(); } }
再次傳送請求就沒問題了
參考
寫部落格不易,轉載請保留原文連結,謝謝!
原文連結: