1、前端UI框架用的是layui,这玩意很强大,有兴趣的小伙伴可以了解一下,https://www.layui.com/demo/upload.html
注意:如果你要用到layui框架,必须引入相对应的js和css,我在百度网盘下已经为大家准备好了:
https://pan.baidu.com/s/1kL6ijrqC99M8MFOF7qMvMg
提取码: xj9e
好了,废话不多说上菜:
一、图片上传HTML、Js、后台接口
HTML:
<html>
<head>
<title>列表</title>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport">
<script src="/static/opperations/js/layui/layui.js"></script>
<link rel="stylesheet" href="/static/opperations/js/layui/css/layui.css">
</head>
<body>
<fieldset class="layui-elem-field layui-field-title" style="margin-top: 30px;">
<legend>常规使用:普通图片上传</legend>
</fieldset>
<div class="layui-upload">
<button type="button" class="layui-btn" id="test1">上传图片</button>
<div class="layui-upload-list">
<img class="layui-upload-img" id="demo1">
<p id="demoText"></p>
</div>
</div>
</body>
</html>
Js:
layui.use('upload', function(){
var $ = layui.jquery
,upload = layui.upload;
//普通图片上传
var uploadInst = upload.render({
elem: '#test1'
,url: '/fileUpload/uplodImgs'
,before: function(obj){
//预读本地文件示例,不支持ie8
obj.preview(function(index, file, result){
$('#demo1').attr('src', result); //图片链接(base64)
});
} , choose: function (obj) {
//预读本地文件示例,不支持ie8
obj.preview(function (index, file, result) {
$('#demo1').attr('src', result); //图片链接(base64)
isDefault = 1;
uploadInst.config.elem.next()[0].value = ''
});
}
,done: function(res){
//如果上传成功
if(res.code > 0){
return layer.msg('上传成功');
}
//上传失败
}
,error: function(){
//演示失败状态,并实现重传
var demoText = $('#demoText');
demoText.html('<span style="color: #FF5722;">上传失败</span> <a class="layui-btn layui-btn-xs demo-reload">重试</a>');
demoText.find('.demo-reload').on('click', function(){
uploadInst.upload();
});
}
});
后台接口:
这个接口最后是做成了使用微信小程序拍照上传的接口,所以你可以不看之前的HTML和js。
引入的包,自己找找
import com.alibaba.fastjson.JSONObject;
import com.purete.api.entity.sys.SysAttachmentEntity;
import com.purete.api.service.api.opers.member.DeviceUserApplicationService;
import com.purete.api.service.api.sys.SysAttachmentService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
接口代码:
@RequestMapping(value = "/uplodImgs", method = { RequestMethod.POST })
@ResponseBody
public JSONObject uplodImgs(@RequestParam(value = "file", required = false) MultipartFile file, String uuid,HttpServletRequest request, HttpServletResponse response)
{
JSONObject result = new JSONObject();
//附件表
SysAttachmentEntity sysAttachmentEntity = new SysAttachmentEntity();
BufferedOutputStream out = null;
InputStream fileInput = null;
String originalName = null;
String path = null;
String prefix = null;
if (file!=null && !file.isEmpty()) {
String filePath = file_path +"useraudit"+"/"+ uuid + File.separator;
originalName = file.getOriginalFilename();
prefix = originalName.substring(originalName.lastIndexOf(".") + 1);
String newFileName = System.currentTimeMillis() + "." + prefix;
File tempFile = new File(filePath);
if (!tempFile.exists())
{
tempFile.mkdirs();
}
path = filePath + newFileName;
path = path.replace("\\", "/");
try
{
out = new BufferedOutputStream(new FileOutputStream(new File(path)));
out.write(file.getBytes());
out.flush();
out.close();
sysAttachmentEntity.setFileName(newFileName);
sysAttachmentEntity.setContentType(prefix);
sysAttachmentEntity.setFilePath(path);
int i= this.sysAttachmentService.insertSelective(sysAttachmentEntity);
}
catch (IOException e)
{
e.printStackTrace();
result.put("flag", false);
result.put("msg", "文件上传失败");
return result;
}finally
{
try
{
if (out != null)
{
out.close();
}
if (fileInput != null)
{
fileInput.close();
}
}
catch (IOException e)
{
e.printStackTrace();
result.put("flag", false);
result.put("msg", "文件上传失败");
}
}
result.put("data", sysAttachmentEntity.getId());
result.put("msg", "文件上传成功");
result.put("flag", true);
return result;
}else{
result.put("msg", "文件为空");
result.put("flag", false);
return result;
}
}
备注:把上传后的接口数据返回给微信小程序。后台还用到了mybatis框架,在SysAttachmentMapper.xml的新增方法中加入一
一 useGeneratedKeys="true" keyColumn="id" keyProperty="id"
举个例子:
<insert id="insertSelective" useGeneratedKeys="true" keyColumn="id" keyProperty="id" parameterType="com.purete.api.entity.sys.SysAttachmentEntity" >
方可取得sysAttachmentEntity这个对象新增后回显的id,微信小程序会把每一次拍照的数据id存放在一个数组里,当小程序把整张表单数据提交时,调用主表的新增接口,将主表信息和附件表的数组id保存到主表中。
@RequestMapping(value = "/userApln/save", method = { RequestMethod.GET, RequestMethod.POST})
@ResponseBody
public JSONObject uplodImg(HttpServletRequest request,HttpServletResponse response,DeviceUserApplicationEntity DeviceUserApplication){
return deviceUserApplicationService.insert(DeviceUserApplication);
}
好了,图片上传就到这了。
二、图片展示HTML、Js、后台接口
HTML:这里用到了layui的图片轮播展示
<html>
<head>
<title>列表</title>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport">
<script src="/static/opperations/js/layui/layui.js"></script>
<link rel="stylesheet" href="/static/opperations/js/layui/css/layui.css">
<style>
#imgresult img{
width: auto;
height:100%;
display: block;
margin: 0 auto;
object-fit: contain;
}
</style>
</head>
<body>
<div id="rrapp" v-cloak>
<input type="hidden" id="andappeId">
<div v-show="showList">
<div class="col-sm-6">
<div class="form-group">
<div id="anappealName" class="col-sm-2 control-label">故障图片</div>
<div class="col-sm-10">
<div class="layui-carousel" id="carouselStyle" lay-filter="LeftRightChange">
<div id="imgresult" carousel-item="">
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<script src=".....js"></script>
</body>
</html>
Js:获取主表对象这条数据,遍历这条数据的附件表id,将id分割,再用分割id去后端调用接口,动态创建图片展示。
if(r.deviceUserApplication.attachment!="" && r.deviceUserApplication.attachment!= null ){
var arr = r.deviceUserApplication.attachment.split(",");
for(var i=0;i<arr.length;i++){
$("#imgresult").append("<div class=''><img id="+i+" src='/fileUpload/displayImg/"+arr[i]+"'></div>");
layui.use(['carousel', 'form'], function(){
var carousel = layui.carousel
,form = layui.form;
//图片轮播
carousel.render({
elem: '#carouselStyle'
,width: '500px'
,height: '350px'
,interval: 5000
,index:1
});
});
}
}else{
$("#anappealName").remove();
}
接口代码:
@RequestMapping(value = "/displayImg/{id}", method = { RequestMethod.POST, RequestMethod.GET })
public String displayImg(@PathVariable Long id, HttpServletRequest request, HttpServletResponse response) throws IOException
{
SysAttachmentEntity sysAttachmentEntity = this.sysAttachmentService.selectByPrimaryKey(id);
if (sysAttachmentEntity == null)
{
return null;
}
File f = new File(sysAttachmentEntity.getFilePath());
//判断该文件是否存在
if (!f.exists())
{
return null;
}
String filepath = sysAttachmentEntity.getFilePath();
//截取时间戳
String fileName = filepath.substring(filepath.lastIndexOf("/")+1);
//获取图片存放路径
File file = new File(filepath);
if (file.exists())
{
// 设置强制下载不打开
response.setContentType("application/force-download");
// 设置文件名 与显示的文件名相匹配 成功就显示
response.addHeader("Content-Disposition", "attachment;fileName=" + fileName);
byte[] buffer = new byte[1024];
FileInputStream fis = null;
BufferedInputStream bis = null;
try
{
fis = new FileInputStream(file);
bis = new BufferedInputStream(fis);
OutputStream os = response.getOutputStream();
int i = bis.read(buffer);
while (i != -1)
{
os.write(buffer, 0, i);
i = bis.read(buffer);
}
os.close();
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
if (bis != null)
{
try
{
bis.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
if (fis != null)
{
try
{
fis.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
}
return null;
}
好了,这就是图片的上传和展示,有需要的小伙伴可以借鉴。希望点评,给出更好的建议。