@PostMapping("insert")
public R insert(@RequestParam(value = "paramJson") String paramJson, @RequestPart(value = "file",required = false) MultipartFile file){
Gson gson = new Gson();
TaskIssues taskIssues = gson.fromJson(paramJson, TaskIssues.class);
/*将文件上传到服务器*/
if (file != null && file.getContentType()!=null ) {
List<SysUploadFile> upload = sysUploadFileService.upload(file);
for (SysUploadFile s : upload) {
taskIssues.setAnnex(s.getUrl());
}
}
taskIssues.setCreateBy(getUserId().toString());
taskIssuesService.insert(taskIssues);
return R.ok("新增成功");
}
注意
@RequestParam接收对象,不能使用@RequestBody接收对象
不然会出现Content type 'multipart/form-data;boundary=--------------------------036764477110441760467042;charset=UTF-8' not supported的错误。
为什么不支持这种类型呢?
我们在上传文件时,spring框架会自动装配文件类型,使用@RequestBody接收对象,所对应的content-type :application/json。所以当使用@RequestBody和文件上传的时候,会报错。
@RequestPart
@RequestPart用于将multipart/form-data类型数据映射到控制器处理方法的参数中。除了@RequestPart注解外,@RequestParam同样可以用于此类操作。
请求头中是否必须包含指定的值,默认值为true。
required为true时,如果请求头中缺少指定的值,则会抛出异常。
required为false时,如果请求头中缺少指定的值,则会返回null。
Gson是JSON解析器,与另一款优秀的JSON解析器FastJson相比Gson的优势是可以准确顺利的转换复杂Bean。如果需要,可以深入了解一下
//保存文件到指定位置 并返回文件的相关信息
private List<SysUploadFile> upload(MultipartFile multipartFile) {
final long FILE_MB_UNIT_SIZE = 1024;
final long FILE_GB_UNIT_SIZE = 100*1024 * 1024;
//用于存储返回数据
List<SysUploadFile> sysUploadFileList = Lists.newArrayList();
SysUploadFile sysUploadFile = new SysUploadFile();
//获取文件大小
long fileSize = multipartFile.getSize();
long kbSize = fileSize / FILE_MB_UNIT_SIZE; //kb
long mSize = fileSize / FILE_GB_UNIT_SIZE;//MB
if (mSize > 0){
sysUploadFile.setSize(StringUtils.join(mSize, "M"));
} else {
sysUploadFile.setSize(StringUtils.join(kbSize, "kb"));
}
// 5. 上传文件 (文件字节, 文件扩展名, )
// 5.1 获取文件扩展名
String fileName = multipartFile.getOriginalFilename();
String suffixName = fileName.substring(fileName.lastIndexOf(".") + 1);
// 5.2 上传
String fileDirPath = "D:/server/file"; // 存放位置
File dirFile = new File(fileDirPath);
// 判断文件目录是否存在
if (!dirFile.exists()) {
// 如果目录没有, 则应该新建目录
dirFile.mkdir();
}
// 准备文件上传路径, 路径 + 文件名称
String filePath= IdUtils.simpleUUID()+fileName;
File realFile = new File(fileDirPath + "/" + filePath); // 保存磁盘路径 + 文件名拼接
// 将字节信息输出到文件中
try {
multipartFile.transferTo(realFile); // 保存到指定的路径
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
写完之后就可以测试了