一、獲取null數據
當前端向後端發送一個formdata的請求,但是請求中沒有攜帶數據時,後端需要做出相應的處理。
後端獲取formdata數據,一般是通過request.getParameter()來獲取的。在沒有數據的情況下,該方法會返回null。如果在後續操作中使用該參數,就會出現空指針異常的情況。因此,需要在使用該參數時,先進行判空處理。
String param = request.getParameter("param"); if(param != null){ //後續操作 }
二、formdata數據格式請求
使用formdata格式的請求時,需要注意後端獲取的方式和普通的參數獲取方式是不同的。因為formdata格式是一個鍵值對,它不能通過request.getParameter()來獲取。
可以使用HttpServletRequest中的getInputStream()方法來獲取整個請求體的字節數組,然後通過解析字節數組來獲取相應的參數。
ServletInputStream inputStream = request.getInputStream(); ByteArrayOutputStream buffer = new ByteArrayOutputStream(); int nRead; byte[] data = new byte[1024]; while ((nRead = inputStream.read(data, 0, data.length)) != -1) { buffer.write(data, 0, nRead); } buffer.flush(); byte[] body = buffer.toByteArray(); String requestBody = new String(body, StandardCharsets.UTF_8);
三、formdata獲取不到值
當使用formdata格式提交表單參數時,如果後端無法獲取到相應的值,可以參考以下方法來排查問題。
首先,需要確認formdata中是否包含相應的鍵值對。其次,需要檢查請求頭中的Content-Type值是否正確。最後,也可以手動打印出整個請求體的字節數組來查看是否有問題。
四、後端獲取form表單數據
普通表單提交的參數可以通過request.getParameter()方法來獲取,但是使用formdata格式提交的表單參數不可以。除了上面提到的getInputStream()方法之外,後端還可以使用getParts()方法來獲取form表單數據。
該方法返回一個Part類型的List,遍歷該List即可獲取到表單中的每一個部分的值。
List parts = request.getParts(); for (Part part : parts) { String name = part.getName(); if(part.getContentType() != null){ InputStream inputStream = part.getInputStream(); //後續操作 } else{ String value = new BufferedReader(new InputStreamReader(part.getInputStream(), StandardCharsets.UTF_8)) .lines().collect(Collectors.joining("\n")); //後續操作 } }
五、formdata格式傳遞參數
使用formdata格式傳遞參數時,一般會傳遞文件類型的參數。後端需要將文件保存到服務器本地,然後記錄文件的本地路徑。
String fileName = part.getSubmittedFileName(); String filePath = "/uploadFile/" + fileName; //文件保存路徑 InputStream inputStream = part.getInputStream(); FileOutputStream outputStream = new FileOutputStream(filePath); byte[] buffer = new byte[1024]; int length; while ((length = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, length); } inputStream.close(); outputStream.close();
六、後端接收formdata
最後,根據前端傳遞過來的formdata數據格式,後端需要有相應的數據接收類。該類需要用@RequestBody註解標註,並且類中的屬性需要與前端傳遞的鍵名相同。這樣,後端才能夠自動地將前端傳遞過來的formdata數據轉換成該類的一個對象。
@PostMapping("/uploadFile") public String postFile(@RequestParam("file") MultipartFile file, @RequestParam("name") String name){ //後續操作 }
原創文章,作者:BXBC,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/150285.html