首先肯定要参考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. VUE 之 JS指令

    1.v-text的用法: 2.v-html 3.v-for 4.v-if , v-else if ,v-else v-if 每次生成都只有一个标签,即符合条件的标签. 5.v-show v-show ...

  2. Provided Maven Coordinates must be in the form 'groupId:artifactId:version'.

    [hadoop@hadoop1 bin]$ ./spark-shell --packages org.mongodb.spark:mongo-spark-connector_2.10-2.2.1 Ex ...

  3. node-sass 安装失败win32-x64-48_binding.node

    升级了nodejs的版本,原项目的node-sass模块启动安装不了. 下载对应的win32-x64-xx_binding.node https://github.com/sass/node-sass ...

  4. IDEA中Git的应用场景

    工作中多人使用版本控制软件协作开发,常见的应用场景归纳如下: 假设小组中有两个人,组长小张,组员小袁 场景一:小张创建项目并提交到远程Git仓库 场景二:小袁从远程git仓库上获取项目源码 场景三:小 ...

  5. Ruby中任务构建工具rake的入门学习教程

    参考:http://www.jb51.net/article/81476.htm Rake简介 Rake的意思是Ruby Make,一个用ruby开发的代码构建工具. 但是,为什么Ruby需要Rake ...

  6. sjtu oj 1201. SuperXOR

    Description Pangzi recently realized that bitwise XOR operation is just an addition without carries. ...

  7. sublime text2 相关插件及其应用

    一.常见的插件 1.Emmet 'ctrl+up':切换文件: "ctrl+alt+enter":创建新的div标签: "shift+ctrl+." :查找相同 ...

  8. POJ1860 Currency Exchange —— spfa求正环

    题目链接:http://poj.org/problem?id=1860 Currency Exchange Time Limit: 1000MS   Memory Limit: 30000K Tota ...

  9. HDU2102 A计划 —— BFS

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2102 A计划 Time Limit: 3000/1000 MS (Java/Others)    Me ...

  10. Web Assembly背景

    Javascript ,也叫Ecma script,  是这家伙用了 10 天时间赶出来的.. 所以,各位程序猿们,如果你觉得老板 10 天要你们上线一个 App 是一个丧心病狂的事情,那么可以多想想 ...