【十三,瑞吉外卖项目】文件上传下载&新增菜品

一,文件上传下载
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,跑成功!
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值