利用layui的load模块解决图片上传
首先肯定要参考layui官网的upload模块文档:http://www.layui.com/doc/modules/upload.html
讲讲思路:在一份添加表单中,我们有个图片上传的模块,然后我们关于图片上传的逻辑是分两步的:点击submit,然后触发图片上事件,图片上传到服务器的指定文件夹中,名字是JavaScript中生成的uuid加上文件本来的后缀名。 然后随着表单一起送到后台,并去到dao层的是这个图片名称的uuid和后缀名(后缀名其实并没有上传而是在后台另外通过file对象获取)
现在直接上项目中的前端代码:
<div class="layui-form-item">
<label class="layui-form-label" style="width: 100px">特征图谱或指纹图谱:</label>
<div class="layui-input-block">
<input type="text" name="medicinalFeatureImgPath" id="medicinalFeatureImgPath" autocomplete="off"
placeholder="" class="layui-input layui-inline" disabled>
<input type="hidden" name="bMedicinalFeatureImgPath" id="bMedicinalFeatureImgPath">
<button type="button" class="layui-btn layui-inline" id="btnBMedicinalFeatureImg">上传图片</button>
<button type="button" style="display: none;"
class="layui-btn layui-inline" id="btnUpBMedicinalFeatureImg"></button>
</div>
<div style="display: none;" class="layui-upload layui-input-block">
<div class="layui-upload-list">
<img class="layui-upload-img" id="BMedicinalFeatureImgFile">
</div>
</div>
</div>
其中这个#medicinalFeatureImgPath是你选完图片后给用户看的图片,而这个#bMedicinalFeatureImgPath是隐藏的,里面装的是JavaScript产生的uuid,然后传到服务器上的。
在页面中的效果:
然后我们在JavaScript中把layui的upload上传的一些配置给封装成一个函数:
/**
* 图片上传图片
* @param btnImg为点击button选择图片
* @param btnUpImg 为指向一个按钮触发上传
* @param mImgPath 图片名称,上传至数据库
* @param imgPath 图片名称 显示在页面上的
* @param medicinalimg 图片上传的路径 就是controller里面的那个请求方法拦截的那个
* @param upload 图片上传服务
*/
function uploadiImage(btnImg,btnUpImg,mImgPath,imgPath,medicinalimg,upload){ var imgname = uuid();//生成一个独一无二的字符串然后存在数据库中 var uploadInsts = upload.render({
elem: '#'+btnImg//框架内容,选择 上传的那个按钮 就告诉这个模块哪个点击哪个按钮发起这个上传文件的操作
,url: productBase.baseUrl+'/'+medicinalimg //根据你controller里的自己设
,accept: 'images'
,size:20000
,auto: false //选择文件后不自动上传
,bindAction: '#'+btnUpImg //指向一个按钮触发上传 这个跟上面那个配合使用,不自动上传就要选一个上传的按钮
,data: {imgname: imgname //就只传个uuid过去,而这个uuid就是存在数据库中的文件名,所以到了后台还要用文件的属性来获取图片的后缀名
} //可选项。额外的参数,如:
,choose: function(obj){
//预读本地文件示例,不支持ie8
obj.preview(function(index, file,result){
var namehous=file.name.substring(file.name.lastIndexOf("."),file.name.length); $('#'+mImgPath).val(imgname+namehous);//图片名称,上传至数据库
$('#'+imgPath).val(file.name);//图片名称,仅仅是在edit界面显示的名称
});
}
,done: function(res){
//如果上传失败
if(res.code > 0){
}
//上传成功
}
,error: function(){ }
});
}
然后是调用这个模块的代码:
先是引入模块:
layui.use(['form', 'layedit', 'upload', 'laydate'], function () { productBase.init();
hideShowInfo();
var layerTips = parent.layer === undefined ? layui.layer : parent.layer, //获取父窗口的layer对象
layer = layui.layer, //获取当前窗口的layer对象
form = layui.form,
upload = layui.upload, //获取upload模块
layedit = layui.layedit;
// var forms = layui.form;
关键代码就那个upload,其他请无视……
然后调用函数把参数穿进去:
uploadiImage('btnBMedicinalFeatureImg','btnUpBMedicinalFeatureImg','bMedicinalFeatureImgPath','medicinalFeatureImgPath','productBasebMedicinalFeatureImg',upload);
然后后台的代码
controller:
@ApiOperation(value="药材质量监测中的特征图谱照片上传", notes="药材质量监测中的特征图谱照片上传")
@PostMapping("/productBasebMedicinalFeatureImg")
public Map<String, Object> upLoadbMedicinalFeatureImg(MultipartFile file,HttpServletRequest
request,@RequestParam Map<String, Object> map) {
//String name = file.getOriginalFilename();
//String suffixName = name.substring(name.lastIndexOf("."));
return productBaseService.saveMedicinalFeatureImg(file,request,map);
}
在controller中我们用spring的MultipartFile来接收传上来的文件(这个requset是没用用的,忘记删了),map里面装的是图片的uuid名字
看serviceImpl:
@Override
public Map<String, Object> saveMedicinalFeatureImg(MultipartFile file, HttpServletRequest request,
Map<String, Object> map) {
// TODO Auto-generated method stub Map<String, Object> maps = new HashMap<String, Object>(); try {
// 判断是否拥有路径,没有就新建
String path = Constant.IMG_PATH_FILE;
if (!new File(path).exists()) {
new File(path).mkdirs();
}
/** 将图片文件保存到服务器,同时返回变成后图片的名字 */
String image = uploadMedicinalFeatrureFile(file, path, map); maps.put("code", 0);
} catch (Exception e) {
maps.put("code", 1);
e.printStackTrace();
}
return maps;//map返回就是代表一个状态而已 }
关键是调用这个uploadMedicinalFeatureFile(file,path,map)
public static String uploadMedicinalFeatrureFile(MultipartFile file,String path,Map<String, Object> map) throws IOException{
String name = file.getOriginalFilename();
String suffixName = name.substring(name.lastIndexOf(".")); String medicinalFeatureUuid = (String)map.get("imgname");
String fileName = medicinalFeatureUuid+suffixName; File tempFile = new File(path,fileName);
if(!tempFile.getParentFile().exists()){
tempFile.getParentFile().mkdir();
}
if(tempFile.exists()){
tempFile.delete();
}
tempFile.createNewFile();
file.transferTo(tempFile);
return tempFile.getName();
}
然后存到数据库的话,只要那个uuid名和表单其他信息一起上传然后走常规的流程就可以了。
所以在表单触发submit的同时要同时触发文件的上传!
利用layui的load模块解决图片上传的更多相关文章
- 基础:enctype 包含上传input时必须(解决图片上传不成功问题)
今天在做一个上传图片的时候,死活就是看不到传过去的值..对比了写法没发现问题,后来抱着试试看的心,查看下了 from里的写法.发现缺少了enctype.不了解这个用法,特意百度了下. enctype ...
- 【node】---multer模块实现图片上传---【巷子】
1.安装muterl第三方模块 cnpm install multer --save 2.使用 multer在解析完成后,会向request对象中添加一个body对象和一个file或者files对象( ...
- 基于THINKPHP+layui+Ajax无刷新实现图片上传预览
<fieldset class="layui-elem-field" style="width:500px;margin:50px 0 0 300px;" ...
- kindeditor Springmvc 整和解决图片上传问题
1. 在编辑页面引入js <script type="text/javascript" charset="utf-8" src="${baseP ...
- iOS 解决图片上传到服务器旋转90度的问题(图片倒置)
//使用swift的朋友们可以,把这个所在的类的.h,在-Header-Swift.h中一用一下. - (UIImage *)fixOrientation:(UIImage *)aImage { if ...
- nodejs -formidable模块实现图片上传。
var form = new formidable.IncomingForm(); form.uploadDir="/localnonobank/test/images/"; ...
- Nodejs之MEAN栈开发(四)---- form验证及图片上传
这一节增加推荐图书的提交和删除功能,来学习node的form提交以及node的图片上传功能.开始之前需要源码同学可以先在git上fork:https://github.com/stoneniqiu/R ...
- form验证及图片上传
form验证及图片上传 这一节增加推荐图书的提交和删除功能,来学习node的form提交以及node的图片上传功能.开始之前需要源码同学可以先在git上fork:https://github.com/ ...
- ios base64图片上传失败问题
今天做图片上传,后台用的是base64解密图片二进制文件,以前都是用表单上传来解决图片上传的,现在后台没有人改,所以研究下base64上传. 需要将图片base64加密,但是调用 [data base ...
随机推荐
- RedisCluster集群原理
主从复制,数据值每个服务器都存了. 针对redis集群的解决方案, 连接这个集群,不用在乎Master了 6台redis 1.why use Redis? 减轻数据库访问压力 2.持久化 RDB(间隔 ...
- JS判断按时间跳转到相应的页面
<!--时间段跳转js--><script language="javaScript" type="text/javascript"> ...
- codeforces C. Magic Formulas 解题报告
题目链接:http://codeforces.com/problemset/problem/424/C 题目意思:给出 n 个数:p1, p2, ..., pn,定义: q1 = p1 ^ (1 mo ...
- 深入浅出Oracle学习笔记:Buffer Cache 和Shared pool
Buffer cache 和 share pool 是sga中最重要最复杂的部分. 一.Buffer Cache 通常数据的读取.修改都是通过buffer cache 来完成的.buffer cach ...
- WebStorm配置SVN
下载SVN客户端管理工具TortoiseSVN-1.8.5.25224-x64-svn-1.8.8,选择合适的Windows版本 配置项目目录,对应的VCS为Subversion 设置Subversi ...
- Go语言的管道Channel用法
本文实例讲述了Go语言的管道Channel用法.分享给大家供大家参考.具体分析如下: channel 是有类型的管道,可以用 channel 操作符 <- 对其发送或者接收值. ch <- ...
- liunx命令之【查看某个端口号的使用情况】
第一:查看端口占用情况的命令:lsof -i:<端口号>
- Java中断机制
1. 引言 当我们点击某个杀毒软件的取消按钮来停止查杀病毒时,当我们在控制台敲入quit命令以结束某个后台服务时……都需要通过一个线程去取消另一个线程正在执行的任务.Java没有提供一种安全直接的方法 ...
- 廖雪峰python3练习题二
字符串和编码 题目: 答案: #!/usr/bin/env python3 #-*- coding:utf-8 -*- s1 = 72 s2 = 85 print('小明的成绩提高了%.1f%%个百分 ...
- JavaScript-Tool:wdtree
ylbtech-JavaScript-Tool:wdtree 1.返回顶部 1. 插件描述:wdTree是一个轻量级jQuery插件用于创建一个带有嵌套Check Boxe的树形控件. wdTree是 ...