spring boot項目同時傳遞參數和文件的多種方式代碼演示
在開發(fā)接口中,遇到了需要同時接收參數和文件的情況,可以有多種方式實現(xiàn)文件+參數的接收,這里基于spring boot 3 + vue 3 + axios,做一個簡單的代碼演示。
1 簡單參數 + 文件參數
參數較少時,比較方便,直接參數接受即可
1.1 后端接口
@RestController
@RequestMapping("/param")
@Validated
public class FileParamController extends BaseController {
/**
* 簡單參數
*
* @param test1
* @param test2
* @param file
* @return
*/
@PostMapping("/file-simple-param")
public Map<String, Object> fileAndSimpleParam(@RequestParam @NotBlank String test1,
@RequestParam @NotBlank String test2,
@RequestParam MultipartFile file) {
Map<String, Object> objectMap = new HashMap<>();
objectMap.put("test1", test1);
objectMap.put("test2", test2);
objectMap.put("fileName", file.getOriginalFilename());
return objectMap;
}
}1.2 前端請求
const fileAndSimpleParamFuc = (methodParam: { file: string | Blob }) => {
let formData = new FormData()
formData.append('test1', 'test1')
formData.append('test2', 'test2')
formData.append('file', methodParam.file)
fileAndSimpleParam(formData).then(resp => {
console.log(resp)
})
}fileAndSimpleParam 為封裝的api請求方法,可查看下文的 param.ts
2 簡單參數轉JavaBean + 文件參數
將各個參數封裝到一個JavaBean中接收,同時接收文件參數,此時JavaBean參數不加任何注解,不支持接收List參數
2.1 后端接口
@RestController
@RequestMapping("/param")
@Validated
public class FileParamController extends BaseController {
/**
* 簡單參數轉JavaBean接收,不支持如:LIst<xxx> 這樣的屬性
*
* @param bean
* @param file
* @return
*/
@PostMapping("/file-simple-bean")
public SimpleBean fileAndSimpleJavaBean(@Validated SimpleBean bean, @RequestParam MultipartFile file) {
bean.setFileName(file.getOriginalFilename());
return bean;
}
}SimpleBean.java
@Data
public class SimpleBean {
@NotBlank
private String test1;
@NotBlank
private String test2;
@Null(message = "The fileName is not support to be used")
private String fileName;
}2.2 前端請求
const fileAndSimpleJavaBeanFuc = (methodParam: { file: string | Blob }) => {
let formData = new FormData()
formData.append('test1', 'test1')
formData.append('test2', 'test2')
formData.append('file', methodParam.file)
fileAndSimpleJavaBean(formData).then(resp => {
console.log(resp)
})
}fileAndSimpleJavaBean 為封裝的api請求方法,可查看下文的 param.ts
3 簡單參數轉String + 文件參數
在這種接收方式中,使用String來接收參數,在使用工具(如fastjson)手動轉為JavaBean,支持接收List參數,但是需要自行校驗參數是否滿足要求
3.1 后端接口
@RestController
@RequestMapping("/param")
@Validated
public class FileParamController extends BaseController {
/**
* 參數轉字符串接收,支持復雜參數屬性,如:List<xxx>
*
* @param bean
* @param file
* @return
*/
@PostMapping("/file-and-json")
public SimpleBean fileAndJsonJavaBean(String bean, @RequestParam MultipartFile file) {
SimpleBean simpleBean = JSON.parseObject(bean, SimpleBean.class);
//自定義參數校驗
List<String> valid = ValidatorUtils.validFast(simpleBean);
if (!valid.isEmpty()) {
throw new FailException(String.join(",", valid));
}
simpleBean.setFileName(file.getOriginalFilename());
return simpleBean;
}
}SimpleBean.java
@Data
public class SimpleBean {
@NotBlank
private String test1;
@NotBlank
private String test2;
private List<ParamBO> params;
@Null(message = "The fileName is not support to be used")
private String fileName;
}ValidatorUtils.java
借助spring的參數校驗做自定義調用
public class ValidatorUtils {
private static final Validator VALIDATOR_FAST = Validation.byProvider(HibernateValidator.class).configure().failFast(true).buildValidatorFactory().getValidator();
private static final Validator VALIDATOR_ALL = Validation.byProvider(HibernateValidator.class).configure().failFast(false).buildValidatorFactory().getValidator();
private ValidatorUtils(){}
/**
* 參數校驗,遇到第一個不合法的字段直接返回不合法字段,后續(xù)字段不再校驗
*
* @param object
* @return
* @param <T>
*/
public static <T> List<String> validFast(T object, Class<?>... groups){
return valid(VALIDATOR_FAST, object, groups);
}
/**
* 校驗所有字段并返回不合法字段
*
* @param object
* @return
* @param <T>
*/
public static <T> List<String> validAll(T object, Class<?>... groups){
return valid(VALIDATOR_ALL, object, groups);
}
private static <T> List<String> valid(Validator validator, T object, Class<?>... groups){
Set<ConstraintViolation<T>> errors = validator.validate(object, groups);
return errors.stream().map(ConstraintViolation::getMessage).toList();
}
}3.2 前端請求
const fileAndJsonStringToJavaBeanFuc = (methodParam: { file: string | Blob }) => {
let paramList = []
for (let i = 0; i < 3; i++) {
let param = { username: '參數' + i, data: '參數值' + i }
paramList.push(param)
}
let data = {
test1: 'test1',
test2: 'test2',
params: paramList
}
let formData = new FormData()
formData.append('bean', JSON.stringify(data))
formData.append('file', methodParam.file)
fileAndJsonStringToJavaBean(formData).then(resp => {
console.log(resp)
})
}fileAndJsonStringToJavaBean 為封裝的api請求方法,可查看下文的 param.ts
4 文件放入JavaBean接收
將文件作為JavaBean的屬性,隨參數一起接收
4.1 后端接口
@RestController
@RequestMapping("/param")
@Validated
public class FileParamController extends BaseController {
/**
* 文件放入JavaBean一起提交
*
* @param bean
* @return
*/
@PostMapping(value = "/file-in-bean")
public String fileInJavaBean(@Validated FileInBeanBO bean) {
bean.setFileName(bean.getFile().getOriginalFilename());
return bean.getFile().getOriginalFilename();
}
}FileInBeanBO.java
@Data
public class SimpleBean {
@NotBlank
private String test1;
@NotBlank
private String test2;
@Null(message = "The fileName is not support to be used")
private String fileName;
private MultipartFile file;
}4.2 前端請求
此處需要特別注意,需要修改Content-Type
const fileInJavaBeanFuc = (methodParam: { file: string | Blob }) => {
let formData = new FormData()
formData.append('test1', 'test1')
formData.append('test2', 'test2')
formData.append('file', methodParam.file)
fileInJavaBean(formData).then(resp => {
console.log(resp)
})
}fileInJavaBean 為封裝的api請求方法,可查看下文的 param.ts
5 文件和參數分別接收,@RequestPart注解
使用@RequestPart注解,實現(xiàn)參數與文件分別接收,應該來說是最優(yōu)解,優(yōu)先推薦
5.1 后端接口
@RestController
@RequestMapping("/param")
@Validated
public class FileParamController extends BaseController {
/**
* 參數與文件分開接收,支持復雜參數屬性,如:List<xxx>
*
* @param bean
* @param file
* @return
*/
@PostMapping("/file-and-bean")
public FileBeanBO fileAndJavaBean(@RequestPart @Validated FileBeanBO bean, @RequestPart MultipartFile[] file) {
String collect = Arrays.stream(file).map(MultipartFile::getOriginalFilename).collect(Collectors.joining(","));
bean.setFileName(collect);
return bean;
}
}FileBeanBO.java
@Data
public class SimpleBean {
@NotBlank
private String username;
@Valid
@NotEmpty
private List<ParamBO> params;
@Null(message = "The fileName is not support to be used")
private String fileName;
@Data
public class ParamBO {
private String username;
private Object data;
}
}5.2 前端請求
此處需要特別注意,需要手動指定JavaBean的類型 Content-Type
const fileAndJavaBeanFuc = (methodParam: { file: string | Blob }) => {
let formData = new FormData()
let paramList = []
for (let i = 0; i < 3; i++) {
let param = { username: '參數' + i, data: '參數值' + i }
paramList.push(param)
}
let data = {
username: '張三',
params: paramList
}
formData.append('bean', new Blob([JSON.stringify(data)], { type: 'application/json' }))
formData.append('file', methodParam.file)
fileAndJavaBean(formData).then(resp => {
console.log(resp)
})
}fileAndJavaBean 為封裝的api請求方法,可查看下文的 param.ts
6 前端封裝 param.ts
export const fileAndSimpleParam = (params: any) => {
return axios.post('/param/file-simple-param', params)
}
export const fileAndSimpleJavaBean = (params: any) => {
return axios.post('/param/file-simple-bean', params)
}
export const fileAndJsonStringToJavaBean = (params: any) => {
return axios.post('/param/file-and-json', params)
}
export const fileInJavaBean = (params: any) => {
return axios.post('/param/file-in-bean', params, {
headers: {
'Content-Type': 'multipart/form-data'
}
})
}
export const fileAndJavaBean = (params: any) => {
return axios.post('/param/file-and-bean', params)
}7 后記
以上5種方式,都能實現(xiàn)參數與文件同時接受,至于使用哪一種,看具體需求,參數太多的時候,可以優(yōu)先考慮@RequestPart注解。
到此這篇關于spring boot項目同時傳遞參數和文件的多種方式的文章就介紹到這了,更多相關spring boot傳遞參數和文件內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
MyBatis關閉一級緩存的兩種方式(分注解和xml兩種方式)
這篇文章主要介紹了MyBatis關閉一級緩存的兩種方式(分注解和xml兩種方式),mybatis默認開啟一級緩存,執(zhí)行2次相同sql,但是第一次查詢sql結果會加工處理這個時候需要關閉一級緩存,本文給大家詳細講解需要的朋友可以參考下2022-11-11
Java實現(xiàn)導入導出Excel文件的方法(poi,jxl)
這篇文章主要介紹了Java實現(xiàn)導入導出Excel文件的方法(poi,jxl),本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-08-08
java環(huán)境變量為什么要配置path和classpath詳細解答
為何配置path?為何配置classpath?當時初學java時只是關心如何做而不去關心這些問題,接下來介紹一下,感興趣的朋友可以參考下哦2013-01-01
SpringCloud中的斷路器(Hystrix)和斷路器監(jiān)控(Dashboard)
本篇主要介紹的是SpringCloud中的斷路器(Hystrix)和斷路器指標看板(Dashboard)的相關使用知識,需要的朋友可以參考下2019-06-06
淺談MyBatisPlus中LocalDateTime引發(fā)的一些問題和解決辦法
MyBatisPlus進行數據庫操作時,我們經常會遇到處理日期時間類型的需求,本文主要介紹了淺談MyBatisPlus中LocalDateTime引發(fā)的一些問題和解決辦法,具有一定的參考價值,感興趣的可以了解一下2024-07-07

