首先肯定要参考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模块解决图片上传的更多相关文章

  1. 基础:enctype 包含上传input时必须(解决图片上传不成功问题)

    今天在做一个上传图片的时候,死活就是看不到传过去的值..对比了写法没发现问题,后来抱着试试看的心,查看下了 from里的写法.发现缺少了enctype.不了解这个用法,特意百度了下. enctype ...

  2. 【node】---multer模块实现图片上传---【巷子】

    1.安装muterl第三方模块 cnpm install multer --save 2.使用 multer在解析完成后,会向request对象中添加一个body对象和一个file或者files对象( ...

  3. 基于THINKPHP+layui+Ajax无刷新实现图片上传预览

    <fieldset class="layui-elem-field" style="width:500px;margin:50px 0 0 300px;" ...

  4. kindeditor Springmvc 整和解决图片上传问题

    1. 在编辑页面引入js <script type="text/javascript" charset="utf-8" src="${baseP ...

  5. iOS 解决图片上传到服务器旋转90度的问题(图片倒置)

    //使用swift的朋友们可以,把这个所在的类的.h,在-Header-Swift.h中一用一下. - (UIImage *)fixOrientation:(UIImage *)aImage { if ...

  6. nodejs -formidable模块实现图片上传。

    var form = new formidable.IncomingForm(); form.uploadDir="/localnonobank/test/images/";   ...

  7. Nodejs之MEAN栈开发(四)---- form验证及图片上传

    这一节增加推荐图书的提交和删除功能,来学习node的form提交以及node的图片上传功能.开始之前需要源码同学可以先在git上fork:https://github.com/stoneniqiu/R ...

  8. form验证及图片上传

    form验证及图片上传 这一节增加推荐图书的提交和删除功能,来学习node的form提交以及node的图片上传功能.开始之前需要源码同学可以先在git上fork:https://github.com/ ...

  9. ios base64图片上传失败问题

    今天做图片上传,后台用的是base64解密图片二进制文件,以前都是用表单上传来解决图片上传的,现在后台没有人改,所以研究下base64上传. 需要将图片base64加密,但是调用 [data base ...

随机推荐

  1. firefox浏览器和IE

    http://blog.csdn.net/pipisorry/article/details/40899701 firefox浏览器插件 [下载地址add-ons for firefox]皮皮blog ...

  2. Cooperating sequential processes》,这篇论文提出了大名鼎鼎的概念信号量,Java里面用于线程同步的wait/notify也是信号量的一种实现。

    闲话高并发的那些神话,看京东架构师如何把它拉下神坛 https://mp.weixin.qq.com/s/lAqn8CfSRta9iSvOR1Le6w

  3. react Native 踩坑记录

    应用 1 安卓打包 经验 解决方案 ,官方 解决方案 2 调试 用 React-Native-Debugger 教程 3 微信分享和登录 使用 react-native-wechat    地址 设计 ...

  4. css3中animation的应用

    1.css3 的相关属性: 相关代码: div { animation-name: myfirst; //动画的名称 animation-duration: 5s; //动画一个周期需要5秒 anim ...

  5. hdu1226

    hdu1226 :点击打开题目链接 本题目由于题目意思,容易得知是一道广搜的题目. 首先. 我们需要知道 ,大数取模,比如 如何判断1234567 对15 取模的数为多少?答案是7,但是如果他是大数怎 ...

  6. maven实战(4)-- maven构建自己的jar到本地仓库中

    在平时的开发中,经常需要用到自己以前开发的一个jar包,那么如何使用将自己开发的jar提交到本地仓库中,供其他的项目依赖呢?主要有三种方法: (1)使用mvn的构建命令:mvn clean insta ...

  7. python-----windows下安装face_recognition库

    如果直接在cmd命令界面 输入:pip install face_recognition 如下图所示: 如果第一次就会出现一系列的问题,解决此问题就安装如下步骤: 一.如果你本机没有安装vistual ...

  8. WebDev.WebServer40.EXE命令使用

    "C:\Program Files (x86)\Common Files\microsoft shared\DevServer\10.0\WebDev.WebServer40.EXE&quo ...

  9. egret 和cocos2d-x-js哪个目前更稳定更好用? ?

    问题: 貌似cocos名气大一些?因为神经猫的大火才知道egret,玩了一下他们的demo,貌似性能一般,不过对flash开发者特别亲切.有人对比过这两个引擎吗?分析下 百牛信息技术bainiu.lt ...

  10. centos7 && centos6.5部KVM使用NAT联网并为虚拟机配置firewalld && iptables防火墙端口转发

    centos7 && centos6.5 部KVM使用NAT联网并为虚拟机配置firewalld && iptables防火墙端口转发 一.准备工作: 1: 检查kvm ...