使用插件模块管理模式:

jsp页面:

<sys:fileUpload fieldName="picList" contentId="true" valueList="${picturesList}"></sys:fileUpload>
<form:hidden id="nameImage" path="prePhoto" htmlEscape="false" maxlength="" class="input-large"/>

引入<sys:fileUpload></sys:fileUpload>标签

<%@ taglib prefix="sys" tagdir="/WEB-INF/tags/sys" %>

fileUpload文件内容:

<%@ tag language="java" pageEncoding="UTF-8"%>
<%@ include file="/WEB-INF/views/include/taglib.jsp"%>
<%@ attribute name="tag" type="java.lang.String" required="false" description="每个列表的标识,如需求分隔不同的列表页,应传入"%>
<%@ attribute name="fieldName" type="java.lang.String" required="true" description="图片对应的字段名称"%>
<%@ attribute name="valueList" type="java.util.List" required="true" description="图片背景实体"%>
<%@ attribute name="contentId" type="java.lang.Boolean" required="true" description="是否包含id"%>
<c:if test="${empty isLoaded}">
<c:set var="isLoaded" value="" scope="request" />
<link href="${ctxStatic}/fileupload/fileUpload.css" rel="stylesheet" />
<script type="text/javascript" src="${ctxStatic }/fileupload/fileUpload.js"></script>
</c:if>
<script type="text/javascript"> $(function(){ <c:forEach var="picture" varStatus="status" items="${picturesList}">
if('${picture.userPhotos}'!=''){
var a = document.getElementById('${fieldName}[${status.index}]');
onloadChange(a,'${picture.userPhotos}');
}
</c:forEach>
});
</script>
<div class="section">
<div class="article">
<c:forEach items="${valueList}" var="picture" varStatus="status">
<div class="item">
<img class="addImg" onclick="clickImg(this);" src="${picture.urlPath }">
<c:if test="${contentId}">
<input type="hidden" class="itemId" value="${picture.id}" name="${fieldName}[${status.index}].id"/>
<input width="200px;" class="userPhotos" id="userPhotos" type="hidden" value="${picture.userPhotos}" name="${fieldName}[${status.index}].userPhotos"/>
</c:if> <input name="${fieldName}[${status.index}].files" id="${fieldName}[${status.index}]" class="upload_input" onchange="change(this)" type="file" accept="image/*">
<div class="preBlock">
<img class="preview" id="preview" alt="" name="pic" width="" height="">
</div>
<img class="delete" onclick="deleteImg(this)" src="${ctxStatic }/images/delete.png">
</div>
</c:forEach>
<div style="clear: left;"></div>
</div>
</div>

fileUpload.js文件内容

  //点击
var clickImg = function(obj){
$(obj).parent().find('.upload_input').click();
}
//删除
var deleteImg = function(obj){
$(obj).parent().find(".userPhotos").val('');
$(obj).parent().find('img.preview').attr("src","");
//IE9以下
$(obj).parent().find('img.preview').css("filter","");
$(obj).hide();
$(obj).parent().find('.addImg').show();
}
//选择图片
function change(file) { //预览
var pic = $(file).parent().find(".preview");
$(file).parent().find(".userPhotos").val(file.value);
//添加按钮
var addImg = $(file).parent().find(".addImg");
//删除按钮
var deleteImg = $(file).parent().find(".delete"); var ext=file.value.substring(file.value.lastIndexOf(".")+).toLowerCase(); // gif在IE浏览器暂时无法显示
if(ext!='png'&&ext!='jpg'&&ext!='jpeg'){
if (ext != '') {
alert("图片的格式必须为png或者jpg或者jpeg格式!");
}
return;
}
//判断IE版本
var isIE = navigator.userAgent.match(/MSIE/)!= null,
isIE6 = navigator.userAgent.match(/MSIE 6.0/)!= null;
isIE10 = navigator.userAgent.match(/MSIE 10.0/)!= null;
if(isIE && !isIE10) {
file.select();
var reallocalpath = document.selection.createRange().text;
// IE6浏览器设置img的src为本地路径可以直接显示图片
if (isIE6) {
pic.attr("src",reallocalpath);
userPhotos.value = reallocalpath;
}else{
// 非IE6版本的IE由于安全问题直接设置img的src无法显示本地图片,但是可以通过滤镜来实现
pic.css("filter","progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='scale',src=\"" + reallocalpath + "\")");
// 设置img的src为base64编码的透明图片 取消显示浏览器默认图片
pic.attr('src','data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==');
}
addImg.hide();
deleteImg.show();
}else {
html5Reader(file,pic,addImg,deleteImg,userPhotos);
}
} //onload展示图片
function onloadChange(file,src) { //预览
var pic = $(file).parent().find(".preview");
//添加按钮
var addImg = $(file).parent().find(".addImg");
//删除按钮
var deleteImg = $(file).parent().find(".delete"); pic.attr("src",src); addImg.hide();
deleteImg.show();
} //H5渲染
function html5Reader(file,pic,addImg,deleteImg){
debugger;
var file = file.files[];
var reader = new FileReader();
reader.readAsDataURL(file);
reader.onload = function(e){ pic.attr("src",this.result);
}
addImg.hide();
deleteImg.show();
}

预览:

这个控件是根据后台配置了几张背景图,就只能上传几张图片,根据需求不同应稍加修改:

删除图片标记:

模拟app端上传图片的更多相关文章

  1. 微擎app端上传图片后删除不了图片

    相信在微擎开发的哥们都知道, 微擎在手册方面还是有点坑的,根本不让人活啊.没办法, 开发时, 只能自己看着源码来搞>>>> 好, 不多说了. 现在来看一个坑  ..直接上代码\ ...

  2. APP端上传图片 - php接口

    $base64="iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABHNCSVQICAgIfAhkiAAAAbRJREFUSIntlDFPFF ...

  3. 利用缓存实现APP端与服务器接口交互的Session控制

    与传统B/S模式的Web系统不同,移动端APP与服务器之间的接口交互一般是C/S模式,这种情况下如果涉及到用户登录的话,就不能像Web系统那样依赖于Web容器来管理Session了,因为APP每发一次 ...

  4. springboot+layui实现PC端用户的增删改查 & 整合mui实现app端的自动登录和用户的上拉加载 & HBuilder打包app并在手机端下载安装

    springboot整合web开发的各个组件在前面已经有详细的介绍,下面是用springboot整合layui实现了基本的增删改查. 同时在学习mui开发app,也就用mui实现了一个简单的自动登录和 ...

  5. python 全栈开发,Day127(app端内容播放,web端的玩具,app通过websocket远程遥控玩具播放内容,玩具管理页面)

    昨日内容回顾 1. 小爬爬 内容采集 XMLY 的 儿童频道 requests 2. 登陆 注册 自动登陆 退出 mui.post("请求地址",{数据},function(){} ...

  6. app端内容播放,web端的玩具,app通过websocket远程遥控玩具播放内容,玩具管理页面

    一.app端内容播放 下载代码 https://github.com/987334176/Intelligent_toy/archive/v1.0.zip 注意:由于涉及到版权问题,此附件没有图片和音 ...

  7. 【转载】Fiddler抓包及模拟服务端

    此文章转载公众号‘云测学院'链接:https://mp.weixin.qq.com/s/qXmBDh980nBJ8IchbRGC3Q 及公众号gloryroadtrain 在HTTP接口的测试过程中, ...

  8. 基于uniapp自定义Navbar+Tabbar组件「兼容H5+小程序+App端Nvue」

    uni-app跨端自定义navbar+tabbar组件|沉浸式导航条|仿咸鱼凸起标签栏 在跨端项目开发中,uniapp是个不错的框架.采用vue.js和小程序语法结构,使得入门开发更容易.拥有非常丰富 ...

  9. web端,app端,小程序端测试差异详解

    前置解释:1.单纯从功能测试的层面上来讲的话,APP 测试.web 测试和H5测试在流程和功能测试上是没有区别的2.Web项目或pc项目都是在电脑上进行测试的.常见的PC项目架构有BS架构和CS架构的 ...

随机推荐

  1. Mysql(三)约束

    一.视图 视图是虚拟的数据表,本身不存储数据,而是提供数据的逻辑 展示.       1.创建视图 create view stu_view as select s1.id, s1.name, s2. ...

  2. [转]Robotium环境搭建中的Errors running builder 'Android Resource Manag

    转自:http://blog.sina.com.cn/s/blog_68f262210102v75t.html 最近学习了Robotium测试框架,当然学习任何一个框架或是语言之前,第一步就是搭建环境 ...

  3. 压力测试以及编译安装httpd2.4

    压力测试以及编译安装httpd2.4 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.使用 deflate_module模块压缩页面优化传输速度 我们的httpd软件自带的有一个 ...

  4. Oracle笔记 - unfinished

    1. plsql查看xmltype字段的xml格式时,出现中文乱码问题,可通过该字段.getClobVal():查询到的xml将是中文不乱码的. 2. extract函数查询xml某节点下的所有节点, ...

  5. python---django中文件上传

    服务端: def upload(req): if req.method == "GET": return render(req, 'upload.html') else: prin ...

  6. SQL记录-PLSQL面向对象

    PL/SQL面向对象 PL/SQL允许定义一个对象类型,这有助于在Oracle的数据库中设计的面向对象.对象类型可以包装复合类型.使用对象允许实现数据的具体结构现实世界中的对象和方法操作它.对象有属性 ...

  7. C#实现物联网系统温度解析的函数(支持补码)

    基于物联网协议上传数据,其中温度占两个字节,如01 27,表示温度值为29.7.温度负值为补码(也就是温度值为有符号数),例如0XFFFF值为负1(-0.1度). 针对补码要求,修改数据解析函数如下: ...

  8. POJ 3252 Round Number(数位DP)

    Round Numbers Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 6983   Accepted: 2384 Des ...

  9. SQL语句(十四)子查询

    --1. 使用IN关键字 --例1 查询系别人数不足5人的系别中学生的学号.姓名和系别 --系别人数不足5人的系别 ==>选择条件 select Sdept from Student Group ...

  10. 【整理】HTML5游戏开发学习笔记(2)- 弹跳球

    1.预备知识(1)在画布上绘制外部图片资源(2)梯度(gradient):HTML5中的对象类型,包括线性梯度和径向梯度.如createLinearGradient,绘制梯度需要颜色组http://w ...