欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

spring boot項(xiàng)目同時(shí)傳遞參數(shù)和文件的多種方式代碼演示

 更新時(shí)間:2023年06月27日 11:28:32   作者:kangaroo.  
這篇文章主要介紹了spring boot項(xiàng)目同時(shí)傳遞參數(shù)和文件的多種方式,在開(kāi)發(fā)接口中,遇到了需要同時(shí)接收參數(shù)和文件的情況,可以有多種方式實(shí)現(xiàn)文件+參數(shù)的接收,這里基于spring boot 3 + vue 3 + axios,做一個(gè)簡(jiǎn)單的代碼演示,需要的朋友可以參考下

在開(kāi)發(fā)接口中,遇到了需要同時(shí)接收參數(shù)和文件的情況,可以有多種方式實(shí)現(xiàn)文件+參數(shù)的接收,這里基于spring boot 3 + vue 3 + axios,做一個(gè)簡(jiǎn)單的代碼演示。

1 簡(jiǎn)單參數(shù) + 文件參數(shù)

參數(shù)較少時(shí),比較方便,直接參數(shù)接受即可

1.1 后端接口

@RestController
@RequestMapping("/param")
@Validated
public class FileParamController extends BaseController {
    /**
     * 簡(jiǎn)單參數(shù)
     *
     * @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 前端請(qǐng)求

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請(qǐng)求方法,可查看下文的 param.ts

2 簡(jiǎn)單參數(shù)轉(zhuǎn)JavaBean + 文件參數(shù)

將各個(gè)參數(shù)封裝到一個(gè)JavaBean中接收,同時(shí)接收文件參數(shù),此時(shí)JavaBean參數(shù)不加任何注解,不支持接收List參數(shù)

2.1 后端接口

@RestController
@RequestMapping("/param")
@Validated
public class FileParamController extends BaseController {
    /**
     * 簡(jiǎn)單參數(shù)轉(zhuǎn)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 前端請(qǐng)求

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請(qǐng)求方法,可查看下文的 param.ts

3 簡(jiǎn)單參數(shù)轉(zhuǎn)String + 文件參數(shù)

在這種接收方式中,使用String來(lái)接收參數(shù),在使用工具(如fastjson)手動(dòng)轉(zhuǎn)為JavaBean,支持接收List參數(shù),但是需要自行校驗(yàn)參數(shù)是否滿足要求

3.1 后端接口

@RestController
@RequestMapping("/param")
@Validated
public class FileParamController extends BaseController {
    /**
     * 參數(shù)轉(zhuǎn)字符串接收,支持復(fù)雜參數(shù)屬性,如: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);
        //自定義參數(shù)校驗(yàn)
        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的參數(shù)校驗(yàn)做自定義調(diào)用

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(){}
    /**
     * 參數(shù)校驗(yàn),遇到第一個(gè)不合法的字段直接返回不合法字段,后續(xù)字段不再校驗(yàn)
     *
     * @param object
     * @return
     * @param <T>
     */
    public static <T> List<String> validFast(T object, Class<?>... groups){
        return valid(VALIDATOR_FAST, object, groups);
    }
    /**
     * 校驗(yàn)所有字段并返回不合法字段
     *
     * @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 前端請(qǐng)求

const fileAndJsonStringToJavaBeanFuc = (methodParam: { file: string | Blob }) => {
	let paramList = []
	for (let i = 0; i < 3; i++) {
		let param = { username: '參數(shù)' + i, data: '參數(shù)值' + 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請(qǐng)求方法,可查看下文的 param.ts

4 文件放入JavaBean接收

將文件作為JavaBean的屬性,隨參數(shù)一起接收

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 前端請(qǐng)求

此處需要特別注意,需要修改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請(qǐng)求方法,可查看下文的 param.ts

5 文件和參數(shù)分別接收,@RequestPart注解

使用@RequestPart注解,實(shí)現(xiàn)參數(shù)與文件分別接收,應(yīng)該來(lái)說(shuō)是最優(yōu)解,優(yōu)先推薦

5.1 后端接口

@RestController
@RequestMapping("/param")
@Validated
public class FileParamController extends BaseController {
    /**
     * 參數(shù)與文件分開(kāi)接收,支持復(fù)雜參數(shù)屬性,如: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 前端請(qǐng)求

此處需要特別注意,需要手動(dòng)指定JavaBean的類(lèi)型 Content-Type

const fileAndJavaBeanFuc = (methodParam: { file: string | Blob }) => {
	let formData = new FormData()
	let paramList = []
	for (let i = 0; i < 3; i++) {
		let param = { username: '參數(shù)' + i, data: '參數(shù)值' + 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請(qǐng)求方法,可查看下文的 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種方式,都能實(shí)現(xiàn)參數(shù)與文件同時(shí)接受,至于使用哪一種,看具體需求,參數(shù)太多的時(shí)候,可以優(yōu)先考慮@RequestPart注解。

到此這篇關(guān)于spring boot項(xiàng)目同時(shí)傳遞參數(shù)和文件的多種方式的文章就介紹到這了,更多相關(guān)spring boot傳遞參數(shù)和文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 淺析JVM如何處理Java中的精度轉(zhuǎn)換

    淺析JVM如何處理Java中的精度轉(zhuǎn)換

    在Java編程中,理解不同數(shù)據(jù)類(lèi)型之間的轉(zhuǎn)換機(jī)制對(duì)于寫(xiě)出高效、正確的代碼至關(guān)重要,本文將詳細(xì)探討Java中的精度轉(zhuǎn)換機(jī)制,有需要的小伙伴可以了解下
    2025-03-03
  • 阿里通用OCR文字識(shí)別/圖像識(shí)別/圖片識(shí)別對(duì)接代碼示例(Java篇)

    阿里通用OCR文字識(shí)別/圖像識(shí)別/圖片識(shí)別對(duì)接代碼示例(Java篇)

    這篇文章主要介紹了阿里通用OCR文字識(shí)別/圖像識(shí)別/圖片識(shí)別對(duì)接(Java篇)的相關(guān)資料,文中詳細(xì)介紹了包括開(kāi)通服務(wù)、測(cè)試圖片、編寫(xiě)識(shí)別代碼、處理識(shí)別結(jié)果等步驟,需要的朋友可以參考下
    2024-12-12
  • Java中處理金額計(jì)算之使用Long還是BigDecimal詳解

    Java中處理金額計(jì)算之使用Long還是BigDecimal詳解

    在Java后端開(kāi)發(fā)中處理與錢(qián)有關(guān)的業(yè)務(wù)時(shí),確保金額計(jì)算的準(zhǔn)確性和避免錯(cuò)誤非常重要,這篇文章主要給大家介紹了關(guān)于Java中處理金額計(jì)算之使用Long還是BigDecimal的相關(guān)資料,需要的朋友可以參考下
    2024-07-07
  • spring boot 中設(shè)置默認(rèn)網(wǎng)頁(yè)的方法

    spring boot 中設(shè)置默認(rèn)網(wǎng)頁(yè)的方法

    這篇文章主要介紹了spring boot 中設(shè)置默認(rèn)網(wǎng)頁(yè)的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-04-04
  • SpringBoot框架配置文件路徑設(shè)置方式

    SpringBoot框架配置文件路徑設(shè)置方式

    這篇文章主要介紹了SpringBoot框架配置文件路徑設(shè)置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • JAVA Spring中讓人頭痛的JAVA大事務(wù)問(wèn)題要如何解決你知道嗎

    JAVA Spring中讓人頭痛的JAVA大事務(wù)問(wèn)題要如何解決你知道嗎

    這篇文章主要介紹了Java Spring事務(wù)使用及驗(yàn)證過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2021-09-09
  • hadoop?全面解讀自定義分區(qū)

    hadoop?全面解讀自定義分區(qū)

    Hadoop是一個(gè)由Apache基金會(huì)所開(kāi)發(fā)的分布式系統(tǒng)基礎(chǔ)架構(gòu)。用戶可以在不了解分布式底層細(xì)節(jié)的情況下,開(kāi)發(fā)分布式程序。充分利用集群的威力進(jìn)行高速運(yùn)算和存儲(chǔ)
    2022-02-02
  • Java實(shí)現(xiàn)插入排序,希爾排序和歸并排序

    Java實(shí)現(xiàn)插入排序,希爾排序和歸并排序

    這篇文章主要為大家詳細(xì)介紹了插入排序,希爾排序和歸并排序的多種語(yǔ)言的實(shí)現(xiàn)(JavaScript、Python、Go語(yǔ)言、Java),感興趣的小伙伴可以了解一下
    2022-12-12
  • 使用@ConfigurationProperties實(shí)現(xiàn)類(lèi)型安全的配置過(guò)程

    使用@ConfigurationProperties實(shí)現(xiàn)類(lèi)型安全的配置過(guò)程

    這篇文章主要介紹了使用@ConfigurationProperties實(shí)現(xiàn)類(lèi)型安全的配置過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • Windows系統(tǒng)編寫(xiě)bat腳本啟動(dòng)、停止及重啟Java服務(wù)jar包

    Windows系統(tǒng)編寫(xiě)bat腳本啟動(dòng)、停止及重啟Java服務(wù)jar包

    在bat文件中我們將編寫(xiě)一些代碼來(lái)運(yùn)行Java jar文件,下面這篇文章主要給大家介紹了關(guān)于Windows系統(tǒng)編寫(xiě)bat腳本啟動(dòng)、停止及重啟Java服務(wù)jar包的相關(guān)資料,需要的朋友可以參考下
    2023-12-12

最新評(píng)論