SpringBoot中實(shí)現(xiàn)接收文件和對(duì)象
SpringBoot接收文件和對(duì)象
使用場(chǎng)景:某個(gè)接口,需要同時(shí)接收文件和實(shí)體,也就是參數(shù)
一、這個(gè)時(shí)候,前端就不能json格式傳送數(shù)據(jù)了,要用到multipart/form-data;這種格式傳送數(shù)據(jù)。
二、那么,這個(gè)時(shí)候,后端應(yīng)該怎樣接收這個(gè)參數(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.接收實(shí)體,將文件放到對(duì)象屬性中(推薦)
public class UserFileReq {
?? ?// 參數(shù)
? ? private String username;
? ? // 文件
? ? private MultipartFile file;
? ? // 省略get\set
}
@PostMapping(value = "/upload") ? ?
@ResponseBody ? ?
public String handleFileUpload(UserFileReq req) { ? ?
// 文件和參數(shù) 都在實(shí)體中了
}3.接收參數(shù),將文件放到接收參數(shù)中
這種方法適合接收單個(gè)文件參數(shù),多參數(shù)還是建議用對(duì)象接收,方便擴(kuò)展
@PostMapping(value = "/upload") ? ?
@ResponseBody ? ?
public String handleFileUpload(MultipartFile file) { ? ?
}4.一個(gè)坑,使用第二種方法的時(shí)候
一定不要加@RequestBody,加了這個(gè)注解,就會(huì)報(bào)如下錯(cuò)誤。
{
?"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注解(校驗(yàn)參數(shù)的注解)是可以使用的。
SpringBoot接口同時(shí)接收J(rèn)SON數(shù)據(jù)和文件時(shí)遇到的問(wèn)題
最近公司有一個(gè)需求,需要通過(guò)一個(gè)接口上傳處理好的數(shù)據(jù),由于數(shù)據(jù)太復(fù)雜,所以就采用了JSON格式提交數(shù)據(jù),接口通過(guò)@RequestBody獲取數(shù)據(jù)并且映射到對(duì)應(yīng)的對(duì)象去,這塊需要注意的一個(gè)問(wèn)題就是前端在提交數(shù)據(jù)的時(shí)候需要將HTTP的Headers頭里的Content-Type設(shè)置成application/json才行,本來(lái)寫(xiě)好測(cè)試完大功告成了,結(jié)果突然又改需求了。。要求在提交數(shù)據(jù)的時(shí)候同時(shí)上傳一個(gè)文件,于是便查詢了一下資料,發(fā)現(xiàn)@RequestBody對(duì)應(yīng)的類型是application/json,而文件Multipart對(duì)應(yīng)的類型是multipart/form-data,這兩種格式不兼容,所以無(wú)論怎么寫(xiě)都是調(diào)用失敗的。
原始代碼如下

經(jīng)過(guò)調(diào)查發(fā)現(xiàn)有兩種辦法解決問(wèn)題
首先都是將Content-type類型設(shè)置為multipart/form-data;
1.簡(jiǎn)化參數(shù),將JSON參數(shù)抽取出來(lái),參數(shù)傳遞過(guò)去后再重新拼接。

2.將@RequestBody修飾的實(shí)體參數(shù)當(dāng)做一個(gè)JSON字符串傳遞,傳遞過(guò)去后通過(guò)GSON或者FastJSON轉(zhuǎn)換。


因?yàn)榈诙N方法簡(jiǎn)單,所以采用了第二種方法。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
詳解使用Spring Security OAuth 實(shí)現(xiàn)OAuth 2.0 授權(quán)
本篇文章主要介紹了詳解使用Spring Security OAuth 實(shí)現(xiàn)OAuth 2.0 授權(quán),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-01-01
springboot使JUL實(shí)現(xiàn)日志管理功能
這篇文章主要介紹了springboot使JUL實(shí)現(xiàn)日志管理功能,本文分步驟給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09
Spring中HandlerMethod類源碼詳細(xì)解析
這篇文章主要介紹了Spring中HandlerMethod類源碼詳細(xì)解析,HandlerMethod類用于封裝控制器方法信息,包含類信息、方法Method對(duì)象、參數(shù)、注解等信息,具體的接口請(qǐng)求是可以根據(jù)封裝的信息調(diào)用具體的方法來(lái)執(zhí)行業(yè)務(wù)邏輯,需要的朋友可以參考下2023-11-11
跟我學(xué)Java Swing之游戲設(shè)計(jì)(2)
跟我學(xué)Java Swing之游戲設(shè)計(jì)(2)...2006-12-12
SpringBoot Maven Clean報(bào)錯(cuò)解決方案
這篇文章主要介紹了SpringBoot Maven Clean報(bào)錯(cuò)解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03
Java創(chuàng)建隨機(jī)數(shù)的四種方式總結(jié)
這篇文章主要介紹了java的四種隨機(jī)數(shù)生成方式的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,,需要的朋友可以參考下2022-07-07
springboot快速集成mybatis-plus的詳細(xì)教程
這篇文章主要介紹了springboot快速集成mybatis-plus的教程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09
Java?SSM實(shí)現(xiàn)前后端協(xié)議聯(lián)調(diào)詳解下篇
首先我們已經(jīng)知道,在現(xiàn)在流行的“前后端完全分離”架構(gòu)中,前后端聯(lián)調(diào)是一個(gè)不可能避免的問(wèn)題,這篇文章主要介紹了Java?SSM實(shí)現(xiàn)前后端協(xié)議聯(lián)調(diào)過(guò)程2022-08-08

