spring boot thymeleaf 图片上传web项目根目录操作步骤
作者:fengcai0123 发布时间:2023-11-23 10:50:46
thymeleaf介绍
简单说, Thymeleaf 是一个跟 Velocity、FreeMarker 类似的模板引擎,它可以完全替代 JSP 。相较与其他的模板引擎,它有如下三个极吸引人的特点:
1.Thymeleaf 在有网络和无网络的环境下皆可运行,即它可以让美工在浏览器查看页面的静态效果,也可以让程序员在服务器查看带数据的动态页面效果。这是由于它支持 html 原型,然后在 html 标签里增加额外的属性来达到模板+数据的展示方式。浏览器解释 html 时会忽略未定义的标签属性,所以 thymeleaf 的模板可以静态地运行;当有数据返回到页面时,Thymeleaf 标签会动态地替换掉静态内容,使页面动态显示。
2.Thymeleaf 开箱即用的特性。它提供标准和spring标准两种方言,可以直接套用模板实现JSTL、 OGNL表达式效果,避免每天套模板、该jstl、改标签的困扰。同时开发人员也可以扩展和创建自定义的方言。
3.Thymeleaf 提供spring标准方言和一个与 SpringMVC 完美集成的可选模块,可以快速的实现表单绑定、属性编辑器、国际化等功能。
form方式上传:
//html:
<form enctype="multipart/form-data" method="post" action="/sell/imageUpload">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true"> </button>
<h4 class="modal-title" id="myModalLabel">Edit goods information</h4>
</div>
<div class="modal-body">
<div class="input-group">
<label class="col-lg-4">name:</label>
<input class="col-lg-8" id="edit_name" value="${goods.name}" name="name"/>
</div>
<div class="input-group">
<label class="col-lg-4">code:</label>
<input class="col-lg-8" id="edit_sn" name="sn" value="${goods.sn}" />
</div>
<div class="input-group">
<label class="col-lg-4">weight:</label>
<input class="col-lg-8" id="edit_weight" name="weight" value="${goods.weight}" />
</div>
<div class="input-group">
<label class="col-lg-4">marketPrice:</label>
<input class="col-lg-8" id="edit_marketPrice" name="marketPrice" value="${goods.marketPrice}" />
</div>
<div class="input-group">
<label class="col-lg-4">shopPrice:</label>
<input class="col-lg-8" id="edit_shopPrice" name="shopPrice" value="${goods.shopPrice}" />
</div>
<div class="input-group">
<label class="col-lg-4">unit:</label>
<input class="col-lg-8" id="edit_unit" name="unit" value="${goods.unit}" />
</div>
<div class="input-group">
<label class="col-lg-4">number:</label>
<input class="col-lg-8" id="edit_number" name="number" value="${goods.number}" />
</div>
<div class="input-group">
<label class="col-lg-4">detail:</label>
<textarea class="col-lg-8" id="edit_detail" name="detail" value="${goods.detail}" />
</div>
<div class="input-group">
<!--<form enctype="multipart/form-data" method="post" action="/sell/imageUpload">
<input ype="hidden" id="edit_goods_sn" name="sn" value="${goods.sn}" />-->
image<input type="file" id="edit_image" name="file"/>
<input type="submit" value="upload"/>
<!--</form>-->
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">close</button>
<input type="submit" class="btn btn-primary" id="edit_save" value="submit">提交更改</input>
</div>
</form>
//controller
@RequestMapping(value = "/save",method = RequestMethod.POST)
public String saveGoodsPage(@RequestParam(value = "id",required=false) String id,@RequestParam(value = "name",required=false) String name,@RequestParam(value = "sn",required=false) String sn,
@RequestParam(value = "number",required=false) String number,@RequestParam(value = "weight",required=false) String weight,
@RequestParam(value = "marketPrice",required=false) String marketPrice,@RequestParam(value = "shopPrice",required=false) String shopPrice,
@RequestParam(value = "unit",required=false) String unit, @RequestParam(value = "detail",required=false) String detail,@RequestParam (value="file")MultipartFile file ) {
if (!file.isEmpty()) {
try {
BufferedOutputStream out = new BufferedOutputStream(
new FileOutputStream(new File("src/main/resources/static/images/product/" + sn + ".jpg")));//保存图片到目录下
out.write(file.getBytes());
out.flush();
out.close();
String filename = "\\/images\\/product\\/" + sn + ".jpg";
/*user.setTupian(filename);
//userRepository.save(user);//增加用户*/
} catch (FileNotFoundException e) {
e.printStackTrace();
return "upload error," + e.getMessage();
} catch (IOException e) {
e.printStackTrace();
return "upload error" + e.getMessage();
}
}
//...其他操作
}
补充:变量表达式和星号表达有什么区别吗?
如果不考虑上下文的情况下,两者没有区别;星号语法评估在选定对象上表达,而不是整个上下文什么是选定对象?就是父标签的值,如下:
<div th:object="${session.user}">
<p>Name: <span th:text="*{firstName}">Sebastian</span>.</p>
<p>Surname: <span th:text="*{lastName}">Pepper</span>.</p>
<p>Nationality: <span th:text="*{nationality}">Saturn</span>.</p>
</div>
这是完全等价于:
<div th:object="${session.user}">
<p>Name: <span th:text="${session.user.firstName}">Sebastian</span>.</p>
<p>Surname: <span th:text="${session.user.lastName}">Pepper</span>.</p>
<p>Nationality: <span th:text="${session.user.nationality}">Saturn</span>.</p>
</div>
当然,美元符号和星号语法可以混合使用:
<div th:object="${session.user}">
<p>Name: <span th:text="*{firstName}">Sebastian</span>.</p>
<p>Surname: <span th:text="${session.user.lastName}">Pepper</span>.</p>
<p>Nationality: <span th:text="*{nationality}">Saturn</span>.</p>
</div>
总结
以上所述是小编给大家介绍的spring boot thymeleaf 图片上传web项目根目录操作步骤,希望对大家有所帮助.
来源:https://blog.csdn.net/fengcai0123/article/details/79693562


猜你喜欢
- 本文实例为大家分享了Unity3D选择本地图片并加载的具体代码,供大家参考,具体内容如下①找到System.Windows.Forms.dl
- 通过Socket + Instrumentation实现模拟键盘鼠标事件主要通过以下三个部分组成:Socket编程:实现PC和Emulato
- Service概念及用途:Android中的服务,它与Activity不同,它是不能与用户交互的,不能自己启动的,运行在后台的程序,如果我们
- 本文章主要讲二维数组定义,用法。1.什么是二维数组在二维数组多个元素为一维数组的数组就称为二维数组2.定义格式格式一:元素的数据类型[][]
- public class BeanDefinitionHolder implements BeanMetadataElement { &nb
- 前言这里介绍一个.net自身携带的类ImageAnimator,这个类类似于控制动画的时间轴,使用ImageAnimator.CanAnim
- 一,块作用域首先在深入学习控制结构之前,需要先了解块(block)的概念。块:即复合语句,是指由一对大括号括起来的若干条简单的 Java 语
- 简述:观察Byte值转为字符写入文件如果在java里用byte打印出来只有33 到 126的输出字符比较正常此外发现Byte值为13是空格,
- Android 读取文件内容实现方法,这里整理了几种方法,大家需要可以看下。如果要打开存放在/data/data/<package n
- 判断对象存活方法引用计数法:在对象中添加一个引用计数子,每当一个地方引用他时,计数器就加一,当引用失效时,计数器就减一。会有对象循环引用问题
- package cn.liangjintang.httpproxy;import java.io.BufferedReader;import
- 使用commons的jexl可实现将字符串变成可执行代码的功能,我写了一个类来封装这个功能:import java.util.Map;imp
- LottieLottie 是 Airbnb 开源的一个动画项目,它支持 iOS, mac OS Android RN,由于某些复杂动画的实现
- 上篇说完了如何接入微信公众号,本文说一下微信公众号的最基本功能:普通消息的接收和回复。说到普通消息,那么什么是微信公众号所定义的普通消息呢,
- 现在基于信息安全问题,特别是版本是23以上权限越严格。特别是拍照,读,写权限一般权限允许过,下次就不用询问了的,所以很多应用都喜欢在首页或者
- Map集合和Collection集合的区别Map集合是有Key和Value的,Collection集合是只有Value。Collection
- 最近有个需求,需要统计APP的在线人数,其实以前也统计过,采取的是上线发送一个请求$this->cache->incr()加1,
- WebSocket介绍WebSocket是HTML5开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。在WebSocket API中
- 概述Sentinel 支持对 Spring Cloud Gateway、Zuul 等主流的 API Gateway 进行限流。Sentine
- let 和 var(a): let 声明的变量只在 let 命令所在的代码块内有效(b): let 是在代码块内有效,var 是在全局范围内