系列文章目录
前言
记录下,想形成写博客的习惯来锻炼自己,有不对的地方请各位在评论中给我指出来,请指点~;以下是pigx+vue+element-ui来实现的
一、大致思路(想法)
1、传入图片
2、后台获取图片名字
3、重新设置名称(防止重复名称)
4、存入地址
5、获取地址
6、存入数据库
二、使用步骤
1.引入库
代码如下(示例):
<el-upload style="display: flex;margin-left:5px;" //样式控制,可以不添加
class="upload-picture" //不知道有什么作用,
:action="actionUrl" //上传路径
:headers="headers" //设置请求头,但不知道为啥要传这个token,有晓得的小伙伴说一下
accept=".jpg,.png"
multiple="false" //是否允许多文件上传,这里就上传一个图片,所以就设置成false了
:show-file-list="false" //是否显示文见列表
:before-upload="beforeAvatarUpload" //在文件上传之前执行,一般用于校验上传文件的格式
:http-request="getFile" //自定义上传
>
<el-button size="small" type="primary">点击上传</el-button>
<div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过2MB</div>
</el-upload>
2.js部分
代码如下(示例):
data(){
headers: {
Authorization: 获取的access_token
},
actionUrl:'要上传的路径',
PCOrAppRadio:'1',
}
methods: {
beforeAvatarUpload(file) {
console.log("图片大小",file.size)
const isLt2M = file.size / 1024 / 1024 < 2;
if (!isLt2M) {
this.$message.error('上传头像图片大小不能超过 2MB!');
}
return isLt2M;
},
getFile(item) {
console.log(item.file)
const fd = new FormData()//设置数据,参考
fd.append('filename', item.file)
fd.append('pictureFlag', this.PCOrAppRadio)
// const config = { headers: { 'Content-Type': 'multipart/form-data' }}
//路由将参数传入后台
addPicture(fd).then(res => {
if (res.data.data){
this.$message.success("上传成功!")
}else {
this.$message.error("上传失败!")
}
})
},
}
3.后台
@RestController //返回类中所有方法返回Json数据
@RequestMapping("/请求路径")
@AllArgsConstructor
@Api(value = "picture", tags = "图片上传")
public class PictureController {
private final PictureService pictureService;
/*
* 1、获取的图片
* 2、获取图片名getOriginalFilename
* 3、图片存储路径(图片始终都是要在一个地方储存,数据库储存的是读取地址而不是储存地址,一个是在盘服储存,一个是在浏览器中访问)
* 4、文件上传(file.transferTo())
* 5、存入数据库
* */
@Inner(value = false)
@PostMapping("/pictureIndex")
public R uploadPicture(@RequestParam("filename") MultipartFile file ,@RequestParam("pictureFlag") String pictureFlag) throws IOException {
log.info("接收到的文件数据为:" + file +" pictureFlag =="+ pictureFlag);
if (file.isEmpty()) {
return R.ok("上传文件为空");
}
//文件全名称
String fileName = file.getOriginalFilename();
//后缀名
String suffixName = fileName.substring(fileName.lastIndexOf("."));
//文件名
String prefixName = fileName.substring(0, fileName.lastIndexOf("."));
//上传后的路径
String filePath = "图片存入服务器\本地盘服的存储路径";
//随机生成数字
int anInt = ThreadLocalRandom.current().nextInt();
// 新文件名 防止同一张图片重复提交名称冲突
fileName =prefixName + anInt + suffixName;
//绝对路径--文件的存储路径
String absolutepath=filePath + fileName;
//读取路径 http://192.168.xx.xxx:8080/img/这个路径在浏览器中可以访问到,这样重新在数据库中读出来可以直接显示
String readfilePath = "读取路径";
String readUrl = readfilePath + fileName;
//将图片准备写入本地或服务器
File dest = new File(absolutepath);
//查看是否有父目录没有则创建
if (!dest.getParentFile().exists()) {
dest.getParentFile().mkdirs();
}
//声明实体
Picture picture = new Picture();
picture.setName(fileName);
picture.setFlag(pictureFlag);
picture.setCreateTime(LocalDateTime.now());
picture.setPath(readUrl);
//调用mybatis-plus将数据插入数据库
if(pictureService.save(picture)){
try {
//上传图片
file.transferTo(dest);
return R.ok(true);
} catch (IOException e) {
e.printStackTrace();
}
}
service层,略,只声明下,没有任何逻辑
Mapper,略,添加相应的映射文件就行,
注:PigX,实体中声明属性最好是用驼峰,不要有“_”,不然框架解析出来的不一致,导致你某个属性会赋不上去。
总结
这个功能主要点
1、前端都传到后台什么数据,都有哪些,用到哪些
2、存入服务器的路径
3、怎么生成用于读取的路径,也就是需要存入数据库的数据
4、要是重复提交怎么处理
5、