上传文件:表单要求
1,enctype="multipart/form-data"
2.表单中需要有type="file"的input
3.表单的请求方式一定是POST。即method="post"
servlet要求
1.不能使用request.getParameter
2.使用request.getInputStream例如:
<form action="/file_upload/RegistServlet" method="post" enctype="multipart/form-data">用户:<input name="username" type="text"><br>注册:<input name="password" type="password"><br>照片:<input name="pic" type="file" ><br><input type="submit" value="提交">
</form>

ElementUI提供了上传组件

Spring框架在spring-web对文件上传进行了封装,其底层是基于Apache的commons-fileupload和commons-io组件,,所以使用时在controller的方法声明一个MultipartFile类型参数即可

例如:   ps:  MultipartFile pic的参数名必须与name="pic"一致,不然接收不到
@PostMapping("/upload")
public R<String> upload(MultipartFile pic){return null;
}

文件上传代码

配置路径在yml里

reggie:path: D:\code\image\
@RestController
@RequestMapping("/common")
@Slf4j
public class CommonController {@Value("${reggie.path}")private String basePath;/*** 文件上传* @param file  参数起名与页面那么一致* @return 返回上传文件新名*/@PostMapping("/upload")public R<String> upload(MultipartFile file){log.info("上传图片:{}", file.getName());//传来文件的原始文件名String originalFilename = file.getOriginalFilename();//abc.jpg//获取格式后缀名String substring = originalFilename.substring(originalFilename.lastIndexOf("."));//.jpg//生成随机文件名,避免覆盖String fileName = UUID.randomUUID().toString()+substring; //adsd.jpg//判断目录是否存在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);}

文件下载download 表现形式 为附件形式下载和直接在浏览器打开


/*** 通用Controller类*/@RestController
@RequestMapping("/common")
@Slf4j
public class CommonController {@Value("${reggie.path}")private String basePath;/*** 文件上传* @param file  参数起名与页面那么一致* @return 返回上传文件新名*/@PostMapping("/upload")public R<String> upload(MultipartFile file){log.info("上传图片:{}", file.getName());//传来文件的原始文件名String originalFilename = file.getOriginalFilename();//abc.jpg//获取格式后缀名String substring = originalFilename.substring(originalFilename.lastIndexOf("."));//.jpg//生成随机文件名,避免覆盖String fileName = UUID.randomUUID().toString()+substring; //adsd.jpg//判断目录是否存在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);}/*** 文件下载,在浏览器打开 ,   由于在文件上传成功后放回新文件名,并传到文件下载* @param name 文件名* @param response 响应输出流写回浏览器*/@GetMapping("/download")public void download(String name, HttpServletResponse response){//输入流读文件内容try {//FileInputStream inputStream = new FileInputStream(new File(basePath+name));FileInputStream inputStream = FileUtils.openInputStream(new File(basePath + name));response.setContentType("image/jpeg");//输出流,将文件写回浏览器,在浏览器展示图片ServletOutputStream outputStream = response.getOutputStream();IOUtils.copy(inputStream,outputStream);  //commons-io工具类inputStream.close();outputStream.close();} catch (Exception e) {e.printStackTrace();}}}

菜品新增,传来数据有菜品基本信息和菜品口味,分别插入dish和dishflavors表

DishDto类接收数据

@Data
public class DishDto extends Dish {//菜品口味集合private List<DishFlavor> flavors = new ArrayList<>();private String categoryName;private Integer copies;
}

2.代码生成器生成dish和dishflavors的service ,mapper ,controller

自定义菜品void saveWithFlavor(DishDto dishDto);接口保存菜品基本信息和口味信息

/*** <p>* 菜品管理 前端控制器* </p>** @author author* @since 2022-09-04*/
@RestController
@RequestMapping("/dish")
@Slf4j
public class DishController {@Autowiredprivate DishService dishService;@PostMappingpublic R<String> save(@RequestBody DishDto dishDto){dishService.saveWithFlavor(dishDto);return R.success("新增菜品成功");}}
public interface DishService extends IService<Dish> {//新增菜品,同时插入口味数据void saveWithFlavor(DishDto dishDto);}/*** <p>* 菜品管理 服务实现类* </p>** @author author* @since 2022-09-04*/
@Service
public class DishServiceImpl extends ServiceImpl<DishMapper, Dish> implements DishService {@Autowiredprivate DishFlavorService dishFlavorService;/*** //新增菜品,同时插入口味数据** @param dishDto*/@Override@Transactional //开启事务注解 在启动类加@EnableTransactionManagementpublic void saveWithFlavor(DishDto dishDto) {//保存菜品基本信息this.save(dishDto);//此时dishDto返回回dish的id及DishFlavor的dishIdLong dishId = dishDto.getId();//菜品Id//口味封装菜品IdList<DishFlavor> flavors = dishDto.getFlavors();//对每条口味数据封装dishIdflavors = flavors.stream().map(dishFlavor -> {dishFlavor.setDishId(dishId);return dishFlavor;}).collect(Collectors.toList());//保存口味到口味表dishFlavorService.saveBatch(flavors);}
}

菜品分页查询,由于菜品分页查询要菜品分类name,查询菜品后要对数据进行替换为Dto

@GetMapping("page")public R<Page> page(int page,int pageSize,String name){//分页构造//Page<Dish> pageInfo = new Page<>(page,pageSize);//条件构造,添加过滤、排序// LambdaQueryWrapper<Dish> queryWrapper = new LambdaQueryWrapper();//queryWrapper.like(name != null,Dish::getName,name);//queryWrapper.orderByAsc(Dish::getSort).orderByDesc(Dish::getUpdateTime);//菜品查询成功后,对菜品分类categoryId替换为菜品分类categoryName,应该使用DishDto//dishService.page(pageInfo, queryWrapper);//分页构造Page<Dish> pageInfo = new Page<>(page,pageSize);Page<DishDto> dishDtoPage = new Page<>();//条件构造,添加过滤、排序LambdaQueryWrapper<Dish> queryWrapper = new LambdaQueryWrapper();queryWrapper.like(name != null,Dish::getName,name);queryWrapper.orderByAsc(Dish::getSort).orderByDesc(Dish::getUpdateTime);//菜品查询成功后,对菜品分类categoryId替换为菜品分类categoryName,应该使用DishDtodishService.page(pageInfo, queryWrapper);//拷贝除records()的数据到page<DishDto>BeanUtils.copyProperties(pageInfo,dishDtoPage,"records()"); //复制除records()的数据//菜单数据dish封装成DishDtoList<Dish> records = pageInfo.getRecords();List<DishDto> dishDtoRecords = records.stream().map(dish -> {Long categoryId = dish.getCategoryId();//分类Id//查询分类nameCategory category = categoryService.getById(categoryId);String categoryName = category.getName();DishDto dishDto = new DishDto();BeanUtils.copyProperties(dish,dishDto);//复制属性dishDto.setCategoryName(categoryName);return dishDto;}).collect(Collectors.toList());dishDtoPage.setRecords(dishDtoRecords);return R.success(dishDtoPage);}

菜品修改,1.回显数据,在修改

回显数据

  /*** 根据Id查询菜品及口味信息* @param id* @return*/@GetMapping("/{id}")public R<DishDto> get(@PathVariable Long id){DishDto dishDto = dishService.getByIdWithFlavors(id);return R.success(dishDto);}类
/*** <p>* 菜品管理 服务类* </p>** @author author* @since 2022-09-04*/
public interface DishService extends IService<Dish> {//查询菜品DishDto getByIdWithFlavors(Long id);}类
/*** <p>* 菜品管理 服务实现类* </p>** @author author* @since 2022-09-04*/
@Service
public class DishServiceImpl extends ServiceImpl<DishMapper, Dish> implements DishService {@Autowiredprivate DishFlavorService dishFlavorService;@Overridepublic DishDto getByIdWithFlavors(Long id) {Dish dish = this.getById(id);//查询菜品信息DishDto dishDto = new DishDto();BeanUtils.copyProperties(dish,dishDto);//查询口味xxLambdaQueryWrapper<DishFlavor> queryWrapper = new LambdaQueryWrapper();queryWrapper.eq(DishFlavor::getDishId,dish.getId());List<DishFlavor> dishFlavors = dishFlavorService.list(queryWrapper);//封装口味信息dishDto.setFlavors(dishFlavors);return dishDto;}
}

修改菜品

 @PutMappingpublic R<String> update(@RequestBody DishDto dishDto){dishService.updateWithFlavor(dishDto);return R.success("新增菜品成功");}类
public interface DishService extends IService<Dish> {//更新void updateWithFlavor(DishDto dishDto);
}实现@Override@Transactionalpublic void updateWithFlavor(DishDto dishDto) {//跟新dish基本信息this.updateById(dishDto);Long dishId = dishDto.getId();//跟新dishFlavors基本信息//1.清理原来口味LambdaQueryWrapper<DishFlavor> queryWrapper =new LambdaQueryWrapper<>();queryWrapper.eq(DishFlavor::getDishId,dishDto.getId());dishFlavorService.remove(queryWrapper);//2.提交当前口味List<DishFlavor> dishFlavors = dishDto.getFlavors().stream().map(dishFlavor -> {dishFlavor.setDishId(dishId);return dishFlavor;}).collect(Collectors.toList());dishFlavorService.saveBatch(dishFlavors);}

java的图片文件上传下载,多表新增,菜品信息分页相关推荐

  1. Java实现图片文件上传

    Java实现图片文件上传 Java实现后台图片上传,将上传图片的接口进行分层,便于维护接口. 接口部分(interface) 将接口分为单图片上传以及多图片上传 public interface Fi ...

  2. .Net Core 图片文件上传下载

    当下.Net Core项目可是如雨后春笋一般发展起来,作为.Net大军中的一员,我热忱地拥抱了.Net Core并且积极使用其进行业务的开发,我们先介绍下.Net Core项目下实现文件上传下载接口. ...

  3. Box浅度接触-Java实现Box文件上传下载

    背景 Box(https://www.box.com/home)是定义为内容云,在我有限认知里面,感觉应该和云存储系统没啥区别.近日,有幸和Box做了一次浅度接触,颇为缠绵,记录在这里供有需要的朋友参 ...

  4. Java实现多文件上传下载,kindeditor富文本保存为word文件,文件列表分页显示

    介绍 SpringBoot+Thymeleaf+Mybaits项目部分功能, 实现文件的多文件上传和下载,以及将kindeditor富文本内容保存为.doc文件 文件上传/创建后以列表形式显示,并且可 ...

  5. Java Servlet实现文件上传下载操作

    1.配置对应的文件,导入相应的包 对应包下载地址:https://wws.lanzous.com/ipFtEoyv1je 2.编写jsp页面 代码如下: <%@ taglib prefix=&q ...

  6. java实现Excel文件上传下载(模板)-hutool

    引入依赖 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</arti ...

  7. java ftp 下载慢_Java实现ftp文件上传下载解决慢中文乱码多个文件下载等问题

    废话不多说了,直接给大家贴代码了,具体代码如下所示: //文件上传 public static boolean uploadToFTP(String url,int port,String usern ...

  8. centos nfs java_CentOS下安装配置NFS并通过Java进行文件上传下载

    1:安装NFS (1)安装 yum install nfs-utils rpcbind (2)启动rpcbind服务 systemctl restart rpcbind.service 查看服务状态 ...

  9. 文件上传 java web_JavaWeb 文件上传下载

    1. 文件上传下载概述 1.1. 什么是文件上传下载 所谓文件上传下载就是将本地文件上传到服务器端,从服务器端下载文件到本地的过程.例如目前网站需要上传头像.上传下载图片或网盘等功能都是利用文件上传下 ...

最新文章

  1. 微信小程序获取多选框选中值和选中值对应的id
  2. ctf -- 内存取证分析工具volatility的下载与安装+简单的使用
  3. git只合并某一个分支的某个commit
  4. 基于CNN的阅读理解式问答模型:DGCNN
  5. OpenCV实现幻灯片滑slides soble的实例(附完整代码)
  6. mysql 数据转换dataset_【转】dataset和实体类 之间的转换
  7. NOIP2016愤怒的小鸟 题解报告 【状压DP】
  8. 简单理解RocketMQ---入门
  9. Spring Data JPA 常用 CRUD 操作汇总 及 关联关系( 操作 h2 内存数据)
  10. FPGA_四选一数据选择器
  11. 再论硬件编程,芯片级开发技术。
  12. labview入门到出家11(补充)——基于单片机和labview开发的虚拟示波器
  13. 2018 苹果开发者账号注册、付款流程图解
  14. c语言sub函数是什么,用$Super$$和$Sub$$对函数进行重定义
  15. ScheduledExecutorService:多线程任务调度
  16. SpringBoot mybatis 实现多级树形菜单
  17. Python 如何将视频文件的语音转换为文字,良心之作!
  18. 鹰潭一中2021高考成绩查询,2021年鹰潭高考状元名单公布,鹰潭高考状元学校资料及最高分...
  19. SQL数据库“正在恢复”,解决和查看方法
  20. 纽约大学坦顿学院计算机排名,纽约大学坦顿工程学院排名多少?

热门文章

  1. GPS经纬度转化为百度地图/Google坐标及互转方案
  2. 【转载】城域网IPv6过渡技术—NAT444与DS-lite详解
  3. 淘宝直通车表格拖动时间段选择插件,纯手写80%还原
  4. 【网络聊天室】——基于socket编程的TCP/UDP网络聊天服务器
  5. mysql 视图 中文_Mysql视图-WEB资讯专栏-DMOZ中文网站分类目录-免费收录各类优秀网站的中文网站目录....
  6. result returns more than one elements; nested exception is javax.persistence.NonUniqueResultExceptio
  7. 【PCB设计】Mac系统Autodesk EAGLE PCB使用入门教程
  8. HTTP洪水Gong击网站-演示
  9. java 屏幕识别_Java课程设计:捕获图片以及识别图中的文字
  10. 关于浏览器自动安装Screenshot Pro拓展的问题