最近遇到一个这样的需求 ,就是说我需要上传图片到服务器,也需要将这张照片的其他信息写入到数据库中,比如标题、描述和标签。
照片本身用的MVC的Multipartfile,其他信息开始用的对象来接收的。
- 这是我的服务接口定义
/**
* 将上传的图片信息和相应的图片描述
* 写入到数据库中 事务处理,只有写入成功之后,才能够添加到数据库中
* https://blog.csdn.net/lizhiyuan_eagle/article/details/93484955,
* 为什么用json传信息
* @param bean
* @return
*/
@RequestMapping("/upRelease")
public RespBean upRelease(SpringUserReleaseInputBean bean){
- SpringUserReleaseInputBean 定义
@Data
@AllArgsConstructor
@NoArgsConstructor
public class SpringUserReleaseInputBean extends ActionRootInputBean implements FastJsonInterface {
/**
* 传入的照片信息对象
*/
private Picture params;
/**
* 照片文件
*/
private MultipartFile file;
}
类后面的继承类和实现接口可以不要
但是当我测试接口的时候,才发现,postman form-data没有同时传Multipartfile和对象。
参考 PostMan上传文件同时传json到后台Controller才知道postman不能同时传这两个数据。
然后参考上面文章,将传入的对象改为String的字符串,在代码中做相应处理,对于前端传参,可以将对象json化,问题不大。
- 处理json字符串
// 判断字符串是否为json格式
String picInfo = bean.getPicInfo();
JsonElement jsonEle = null;
try{
jsonEle = new JsonParser().parse(picInfo);
}
catch (Exception e){
e.printStackTrace();
return RespBean.error("图片信息非json格式");
}
if (respBean.getStatus().equals(200) && jsonEle.isJsonObject()){
// 转换成picture对象
Picture params = JSONObject.parseObject(picInfo, Picture.class);
}
- 所有代码
/**
* 将上传的图片信息和相应的图片描述
* 写入到数据库中 事务处理,只有写入成功之后,才能够添加到数据库中
* https://blog.csdn.net/lizhiyuan_eagle/article/details/93484955,
* 为什么用json传信息
* @param bean
* @return
*/
@RequestMapping("/upRelease")
public RespBean upRelease(SpringUserReleaseInputBean bean){
MultipartFile file = bean.getFile();
Assert.assertNotEmpty(file, "file 不能为空");
RespBean respBean = upPicture(file);
// 判断字符串是否为json格式
String picInfo = bean.getPicInfo();
JsonElement jsonEle = null;
try{
jsonEle = new JsonParser().parse(picInfo);
}
catch (Exception e){
e.printStackTrace();
return RespBean.error("图片信息非json格式");
}
if (respBean.getStatus().equals(200) && jsonEle.isJsonObject()){
// 转换成picture对象
Picture params = JSONObject.parseObject(picInfo, Picture.class);
params.setPicUrl(respBean.getMsg());
params.setPicTime(JaDateTime.now().dateValue());
params.setPicStatus(2);
// 判断一下 请求的状态码
// 插入到数据库中
return pictureService.upRelease(params);
}
return RespBean.error("图片上传失败");
}
}
- 附加上传图片的代码
// 在springboot的配置文件中第一一个这样的属性,传入地址
@Value("${prop.upload-folder}")
private String UPLOAD_FOLDER;
/**
* 实现文件是上传到指定的位置
* 传入MultipartFile的文件
* @param file
* @return
*/
public RespBean upPicture(@RequestBody MultipartFile file) {
if (Objects.isNull(file) || file.isEmpty()) {
return RespBean.error("文件为空,请重新上传",file);
}
try {
byte[] bytes = file.getBytes();
Path path = Paths.get(UPLOAD_FOLDER + UUID.randomUUID().toString()+file.getOriginalFilename());
//如果没有files文件夹,则创建
if (!Files.isWritable(path)) {
Files.createDirectories(Paths.get(UPLOAD_FOLDER));
}
//文件写入指定路径
Files.write(path, bytes);
return RespBean.ok(path.toString(),file);
} catch (IOException e) {
e.printStackTrace();
return RespBean.error("后端异常...");
}
}
- bean
@Data
@AllArgsConstructor
@NoArgsConstructor
public class SpringUserReleaseInputBean extends ActionRootInputBean implements FastJsonInterface {
/**
* 照片文件
*/
private MultipartFile file;
/**
* 传入的照片信息 json格式
*/
private String picInfo;
}