SpringBoot上传图⽚和IO 流的基本操作,数据写⼊到⽂件中(聊天记录⼤数据量以⽂件格式存储)
浅谈
我⼀直都觉得上传图⽚好复杂,除了本地上传,还有局域⽹上传,公⽹上传乱七⼋糟的,不仅看不懂,还不想学,因为⽼是觉得本地上传没啥⼤⽤处,直到今天,我才看透,什么本地不本地的,统统都是⼀个套路!
在springboot2.×版本以后,上传时就不需要任何配置了,什么配置⽂件也不需要,啥也不讲了,上来就是⼲!
⾸先来⼀波IO 流的基本操作
本地创建⼀个⽂件向⾥⾯写⼊内容
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
/
** 在本地新建⼀个⽂件夹⾥⾯创建⼀个⽂件向⾥⾯写⼊内容 */
//1. ⽂件夹的路径⽂件名
String directory = "E:\\test";
String filename = "";
//2.  创建⽂件夹对象创建⽂件对象
File file = new File(directory);
//如果⽂件夹不存在就创建⼀个空的⽂件夹
if (!ists()) {
file.mkdirs();
}
File file2 = new File(directory, filename);
/
/如果⽂件不存在就创建⼀个空的⽂件
if (!ists()) {
try {
} catch (IOException e) {
e.printStackTrace();
}
}
//3.写⼊数据
//创建⽂件字节输出流
FileOutputStream fos = new FileOutputStream(directory + "\\" + filename);
/
/开始写
String str = "测试数据";
byte[] bytes = Bytes();
//将byte数组中的所有数据全部写⼊
fos.write(bytes);
//关闭流
fos.close();
读取本地⼀个⽂件中的内容写⼊另⼀个⽂件
import java.io.FileInputStream;
import java.io.FileOutputStream;
/** 读取本地⼀个⽂件中的内容写⼊另⼀个⽂件 */
/
/创建⽂件字节输⼊流这个路径下的⽂件必须存在
FileInputStream fis = new FileInputStream("E:\\test\\");
//创建⽂件字节输出流如果这个⽂件不存在会⾃动创建⼀个
FileOutputStream fos = new FileOutputStream("E:\\test\\");
//⼀边读⼀边写
byte[] bytes = new byte[1024];
int temp = 0;
while ((temp = ad(bytes)) != -1) {
//将byte数组中内容直接写⼊
fos.write(bytes, 0, temp);
}
/
/刷新
fos.flush();
//关闭
fis.close();
fos.close();
1,FileWritter 写⼊⽂件
FileWritter, 字符流写⼊字符到⽂件。默认情况下,它会使⽤新的内容取代所有现有的内容,然⽽,当指定⼀个true (布尔)值作为FileWritter构造函数的第⼆个参数,它会保留现有的内容,并追加新内容在⽂件的末尾。
⽰例:
String url="D:\\";
File file=new File(url);
if(!ists()){
}
FileWriter fileWriter=null;
BufferedWriter bufferedWriter=null;
try {
fileWriter=new FileWriter(file,true);
bufferedWriter=new BufferedWriter(fileWriter);
bufferedWriter.String());
} catch (IOException e) {
e.printStackTrace();
}finally {
bufferedWriter.close();
osBufferedWriter.close();
}
2,FileOutputStream 写⼊⽂件
⽂件输出流是⼀种⽤于处理原始⼆进制数据的字节流类。为了将数据写⼊到⽂件中,必须将数据转换为字节,并保存到⽂件。请参阅下⾯的完整的例⼦。
File file = new File("c:/");
String content = "This is the text content";
try (FileOutputStream fop = new FileOutputStream(file)) {
if (!ists()) {
}
byte[] contentInBytes = Bytes();
fop.write(contentInBytes);
fop.flush();
fop.close();
} catch (IOException e) {
e.printStackTrace();
}
下⾯是我⾃⼰做个⼀个商城项⽬上传图⽚的demo
⾸先是数据库表
这个项⽬使⽤的是springboot,mybatis,thymeleaf
前台html页⾯代码
<div id="div">
<form action="/demo/upload" method="post" enctype="multipart/form-data">
上架的商品名称:<input class="input" type="text" name="name"><br>
商品尺⼨:<select class="input" name="size">
<option value="M">M</option>
<option value="L">L</option>
<option value="XL">XL</option>
<option value="XXL">XXL</option>
</select><br>
商品价格:<input class="input" type="text" name="price"><br>
上架商品数量:<input class="input" type="text" name="number"><br>
商品颜⾊:<select class="input" name="color">
<option value="蓝⾊">蓝⾊</option>
<option value="⽩⾊">⽩⾊</option>
<option value="⿊⾊">⿊⾊</option>
<option value="灰⾊">灰⾊</option>
</select><br>
商品类型:<select class="input" name="kind">
<option value="男装">男装</option>
<option value="⼥装">⼥装</option>
<option value="童装">童装</option>
<option value="时尚包包">时尚包包</option>
</select><br>
原价:<input class="input" type="text" name="preprice"><br>
商品图⽚:<input class="input" type="file" name="pic"><br>
上架⽇期:<input class="input" type="date" name="time"><br>
<input type="submit" value="确认上架">
</form>
</div>
controller层代码
/**
* 商品图⽚上传
*/
@RequestMapping("/upload")
public String upload(@RequestParam(value = "pic") MultipartFile pic,@RequestParam Map param,Model model) throws ParseException {
if(pic.isEmpty()){
}
String OriginalFilename();//得到⽂件名
String suffixName=fileName.substring(fileName.lastIndexOf("."));//得到后缀名
String filepath="D:/tempFiles/files/";//指定图⽚上传到哪个⽂件夹的路径
fileName= UUID.randomUUID()+suffixName;//重新命名图⽚,变成随机的名字jquery是什么有什么作用
File dest=new File(filepath+fileName);//在上传的⽂件夹处创建⽂件
try {
} catch (IOException e) {
e.printStackTrace();
}
//到这⾥为⽌,下⾯的都不⽤再看了,跟上传没关系,都是实体类传值竟然⿇烦成这个样⼦
Shangpin shangpin=new Shangpin();
/
/这⾥就不想改了,把fileName当成picpath传过去算了
String picpath=fileName;
shangpin.setPicpath(picpath);
shangpin.setName((String) ("name"));
shangpin.setSize((String) ("size"));
double price=Double.("price").toString());
shangpin.setPrice(price);
shangpin.setNumber(Integer.("number").toString()));
shangpin.setColor((String) ("color"));
double preprice=Double.("preprice").toString());
shangpin.setPreprice(preprice);
shangpin.setKind((String) ("kind"));
String sellerAccount=phone;
shangpin.setSellerAccount(sellerAccount);
SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd");
shangpin.setTime(simpleDateFormat.parse((String) ("time")));
int i=selectService.insertSP(shangpin);
if(i>0){
model.addAttribute("info","商品上传成功!");
return "forward:getSP";
}
model.addAttribute("info","商品上传失败!");
return "forward:getSP";
}
对了,千万不能忘记实体类,就和上边那张表的字段相对应,⼀个也不能错,错了它也会错。package ity;
import java.util.Date;
public class Shangpin {
private Integer id;
private String name;
private String size;
private double price;
private String sellerAccount;
private int number;
private String color;
private double preprice;
private String picpath;
private Date time;
private String kind;
//set和get ⽅法省略
service层忽略,来看dao层,也就是mapper ⽂件
/**
* 上架商品(上传商品图⽚)
*/
@Insert(value = "insert into shangpin(name,size,price,sellerAccount,number,color," +
"preprice,picpath,time,kind) values(#{name},#{size},#{price}," +
"#{sellerAccount},#{number},#{color},#{preprice},#{picpath},#{time},#{kind})")
int insertSP(Shangpin shangpin);
然后就完成上传了,上传成功之后跳转到列表页⾯,使⽤thymeleaf 提⽰上传成功
<!DOCTYPE html>
<html xmlns:th="">
<head>
<meta charset="utf-8" />
<title>商品管理</title>
<script th:src="@{/js/jquery.1.12.4.min.js}" charset="UTF-8"></script>
</head>
<body>
<a href="/demo/backAddSP">商品上架</a><span th:text="${info}"></span>
<table border="4">
<thead>
<tr>
<th width="100px">序号</th>
<th width="100px">商品名称</th>
<th width="100px">尺⼨</th>
<th width="100px">价格</th>
<th width="100px">数量</th>
<th width="100px">颜⾊</th>
<th width="100px">原价</th>
<th width="100px">商品类型</th>
<th width="100px">图⽚路径</th>
<th width="100px">添加时间</th>
<th width="100px">操作</th>
</tr>
</thead>
<tbody>
<!-- 遍历集合,如果被遍历的变量 userList 为 null 或者不存在,则不会进⾏遍历,也不报错-->
<tr th:each="user : ${list}">
<!-- 将⽤户的主键 uId 存在在 name 属性中-->
<td width="100px" th:text="${user.id}"></td>
<td width="100px" th:text="${user.name}"></td>
<td width="100px" th:text="${user.size}"></td>
<td width="100px" th:text="${user.price}"></td>
<td width="100px" th:text="${user.number}"></td>
<td width="100px" th:text="${lor}"></td>
<td width="100px" th:text="${user.preprice}"></td>
<td width="100px" th:text="${user.kind}"></td>
<td width="100px" th:text="${user.picpath}"></td>
<!-- 使⽤dates对象格式化⽇期-->
图⽚上传到这⾥就结束啦,有问题欢迎留⾔!项⽬地址:链接: 提取码:w6dt    <td width="100px" th:text="${#dates.format(user.time, 'yyyy-MM-dd')}"></td>
<td width="100px"><intput type="button" th:onclick="del([[${user.id}]]);">删除</intput></td>  </tr>
</tbody>
</table>
<script>
function del(id) {
alert(id);
}
</script>
</body>
</html>

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。