一,文件上传下载
1)文件上传介绍
目前一些前端组件库也提供了相应的上传组件,但是底层原理还是基于form表单的文件上传。例如ElementUI中提供的upload上传组件:
服务端接收上传的文件
2)文件下载介绍
本质是对流的操作
3)文件上传代码实现
参数名称必须与下面保持一致
controller
/**
* 文件上传和下载
*/
@Slf4j
@RestController
@RequestMapping("/common")
public class CommonController {
@Value("${reggie.path}")
private String basePath;//在yml指定了一个自定义的文件路径
/**
* 文件上传
* @param file
* @return
*/
@PostMapping("/upload")
public R<String> upload(MultipartFile file){
//file是一个临时文件,在一次请求完成之后该临时文件会删除,需要转存到指定位置、
log.info(file.toString());
//获取原始文件名
String originalFilename = file.getOriginalFilename();
//截取后缀
String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
//为了防止文件名重名而造成文件覆盖,使用一个uuid重新生成一个名称
String fileName = UUID.randomUUID().toString() + suffix;
log.info("文件名:{}",fileName);
//创建一个目录对象,就是说basePath指定的目录中存不存在该文件夹,如果不存在,就创建之
File dir = new File(basePath);
if(!dir.exists()){//目录不存在,需要创建
dir.mkdirs();
}
try {
//将临时文件转存到指定位置
file.transferTo(new File(basePath + fileName));
} catch (IOException e) {
e.printStackTrace();
}
return R.success(fileName);
}
}
测试之:
4)文件下载代码实现
/**
* 文件下载
* @param name
* @param response
*/
@GetMapping("/download")
public void download(String name,HttpServletResponse response){
try {
//通过输入流读取文件内容
FileInputStream inputStream = new FileInputStream(new File(basePath + name));
//通过输出流将文件写回浏览器,在浏览器展示图片
ServletOutputStream outputStream = response.getOutputStream();
response.setContentType("image/jpeg");
int len = 0;
byte [] bytes = new byte[1024];
while ((len = inputStream.read(bytes)) != -1){
outputStream.write(bytes,0,len);
outputStream.flush();
}
//关闭资源
inputStream.close();
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
效果:
二,新增菜品
1)需求分析:
2)数据模型
3)代码开发
①加载分类数据在下拉框中
*页面请求:
ps:在数据库中,1默认是菜品分类,2是套餐分类,所以这里传的是1
*后端
②上传下载
在上方已经实现了后端(略)
③点击保存按钮
*请求
*参数(坏了,我要给自己挖坑了~)
④后端
需要引入DTO来封装两个表对应的数据
/**
* 继承Dish又扩展了DishFlavor
*/
@Data
public class DishDto extends Dish {
private List<DishFlavor> flavors = new ArrayList<>();
//暂时未用到
private String categoryName;
//暂时未用到
private Integer copies;
}
*打个断点测试一下,看看后端有无拿到数据:
*ok,写service
加入事务控制,要让该注解生效,还需要在启动类开启事务注解的支持,保证数据的一致性
*controller
OK,跑成功!