SpringBoot中實現(xiàn)接收文件和對象
SpringBoot接收文件和對象
使用場景:某個接口,需要同時接收文件和實體,也就是參數(shù)
一、這個時候,前端就不能json格式傳送數(shù)據(jù)了,要用到multipart/form-data;這種格式傳送數(shù)據(jù)。
二、那么,這個時候,后端應(yīng)該怎樣接收這個參數(shù)和文件呢?
1.接收HttpServletRequest,自己處理request(不推薦)
@PostMapping(value = "/upload") ? ? @ResponseBody ? ? public String handleFileUpload(HttpServletRequest request) { ? ? MultipartHttpServletRequest params=((MultipartHttpServletRequest) request); ? // 獲取文件 List<MultipartFile> files = ((MultipartHttpServletRequest) request).getFiles("file"); ?? // 獲取參數(shù) String name=params.getParameter("name"); ?
2.接收實體,將文件放到對象屬性中(推薦)
public class UserFileReq { ?? ?// 參數(shù) ? ? private String username; ? ? // 文件 ? ? private MultipartFile file; ? ? // 省略get\set } @PostMapping(value = "/upload") ? ? @ResponseBody ? ? public String handleFileUpload(UserFileReq req) { ? ? // 文件和參數(shù) 都在實體中了 }
3.接收參數(shù),將文件放到接收參數(shù)中
這種方法適合接收單個文件參數(shù),多參數(shù)還是建議用對象接收,方便擴展
@PostMapping(value = "/upload") ? ? @ResponseBody ? ? public String handleFileUpload(MultipartFile file) { ? ? }
4.一個坑,使用第二種方法的時候
一定不要加@RequestBody,加了這個注解,就會報如下錯誤。
{ ?"timestamp": 1571196217195, ?"status": 415, ?"error": "Unsupported Media Type", ?"exception": "org.springframework.web.HttpMediaTypeNotSupportedException", ?"message": "Content type 'multipart/form-data;boundary=2gOOYeFBpE;charset=UTF-8' not supported", ?"path": "/file/upload" }
所以,接收文件,不要使用@RequestBody注解
但是@Validated注解(校驗參數(shù)的注解)是可以使用的。
SpringBoot接口同時接收JSON數(shù)據(jù)和文件時遇到的問題
最近公司有一個需求,需要通過一個接口上傳處理好的數(shù)據(jù),由于數(shù)據(jù)太復(fù)雜,所以就采用了JSON格式提交數(shù)據(jù),接口通過@RequestBody獲取數(shù)據(jù)并且映射到對應(yīng)的對象去,這塊需要注意的一個問題就是前端在提交數(shù)據(jù)的時候需要將HTTP的Headers頭里的Content-Type設(shè)置成application/json才行,本來寫好測試完大功告成了,結(jié)果突然又改需求了。。要求在提交數(shù)據(jù)的時候同時上傳一個文件,于是便查詢了一下資料,發(fā)現(xiàn)@RequestBody對應(yīng)的類型是application/json,而文件Multipart對應(yīng)的類型是multipart/form-data,這兩種格式不兼容,所以無論怎么寫都是調(diào)用失敗的。
原始代碼如下
經(jīng)過調(diào)查發(fā)現(xiàn)有兩種辦法解決問題
首先都是將Content-type類型設(shè)置為multipart/form-data;
1.簡化參數(shù),將JSON參數(shù)抽取出來,參數(shù)傳遞過去后再重新拼接。
2.將@RequestBody修飾的實體參數(shù)當做一個JSON字符串傳遞,傳遞過去后通過GSON或者FastJSON轉(zhuǎn)換。
因為第二種方法簡單,所以采用了第二種方法。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
java生成pdf表格,調(diào)用itext創(chuàng)建的實例
這篇文章主要介紹了java生成pdf表格,調(diào)用itext創(chuàng)建的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01Java Swing組件布局管理器之FlowLayout(流式布局)入門教程
這篇文章主要介紹了Java Swing組件布局管理器之FlowLayout(流式布局),結(jié)合實例形式分析了Swing組件布局管理器FlowLayout流式布局的常用方法及相關(guān)使用技巧,需要的朋友可以參考下2017-11-11Gradle的安裝和IDEA集成、項目導(dǎo)入的詳細教程
這篇文章主要介紹了Gradle的安裝和IDEA集成、項目導(dǎo)入的詳細教程,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-08-08Java overload和override的區(qū)別分析
方法的重寫(Overriding)和重載(Overloading)是Java多態(tài)性的不同表現(xiàn),想要了解更多請參考本文2012-11-11Spring中@ExceptionHandler注解的工作原理詳解
這篇文章主要介紹了Spring中@ExceptionHandler注解的工作原理詳解,Spring Web注解@ExceptionHandler可以用來指定處理某類異常的控制器方法,從而在這些異常發(fā)生時,會有相應(yīng)的控制器方法來處理此類異常,需要的朋友可以參考下2024-01-01spring-mvc/springboot使用MockMvc對controller進行測試
這篇文章主要介紹了spring-mvc/springboot使用MockMvc對controller進行測試,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-11-11借助Maven搭建Hadoop開發(fā)環(huán)境的最詳細教程分享
在Maven插件的幫助下,VSCode寫Java其實非常方便,所以本文就來和大家詳細講講如何借助maven用VScode搭建Hadoop開發(fā)環(huán)境,需要的可以參考下2023-05-05