一、代码
今天在写controller时需要上传文件形式的参数,用swagger2死活都测试不成功,拿postman一试,却成功的将获取到的文件传到controller层,记录一下吧,好记忆不如烂笔头。
先看一下controller接口层:
@ApiOperation(value = "新增模型")
@PostMapping(value = "/uploadFile", consumes = "multipart/*",headers = "content-Type=multipart/form-data")
public BaseResponse addModel(@ApiParam("modelName") @RequestParam(value = "modelName", required = true) String modelName,
@ApiParam("originalName") @RequestParam(value = "originalName", required = false) String originalName,
@ApiParam("modelType") @RequestParam(value = "modelType", required = true) String modelType,
@ApiParam("multipartFiles") @RequestParam(value = "multipartFiles", required = true) MultipartFile[] multipartFiles) {
其中:MultipartFile是一个接口,如果需要上传文件形式,就需要将文件定义为MultipartFile,如果是数组就是MultipartFile[ ]。有别于File类。
public interface MultipartFile extends InputStreamSource
当然MultipartFile的实现类也可以和File之间进行转换:从前端接收到的MultipartFile转换为File类型方便我们操作。转换为File之后会在本地生成一个文件,一般在项目的路径下面,可以通过file.getAbsoluteFile()方法获取生成文件的路径,在操作完成以后记得file.delete()方法删除这个文件,免得浪费空间。
/**
* 转换MultipartFile 为 File文件类型
*/
public File conversionMultipartFileToFile(MultipartFile multipartFile){
String fileName = multipartFile.getOriginalFilename();
File file = new File(fileName);
OutputStream out = null;
try{
//InputStream in = multipartFile.getInputStream();
out = new FileOutputStream(file);
byte[] ss = multipartFile.getBytes();
for(int i = 0; i < ss.length; i++){
out.write(ss[i]);
}
} catch (IOException e) {
e.printStackTrace();
}finally {
if (out != null){
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return file;
}
测试:
用swagger怎么测试传过去的文件都是空的,但是用postman就是可以的,很奇怪,直到现在我还在找原因。swagger2的界面是可以正常选择文件的,但就是传的空文件。
postman测试:
常规类型参数在params:
headers中key-value设置:Content-Type=multipart/form-data
在body中设置文件的参数:选择上传的文件即可,参数类型选择文件File
然后发送请求,就可以正常传送文件流了。
可以看到接口层已经接收到发送过来的文件了。