百度WebUploader上传图片,图片回显编辑,查看
编辑图片,可以删除上次上传的图片,可以新加上传图片
1.首选还是引入css和js(两个css,三个js)
自定义css
.webuploader-container { position: relative; } .webuploader-element-invisible { position: absolute !important; clip: rect(1px 1px 1px 1px); /* IE6, IE7 */ clip: rect(1px,1px,1px,1px); } .webuploader-pick { position: relative; display: inline-block; cursor: pointer; background: #0E9AEF; padding: 10px 15px; color: #fff; text-align: center; border-radius: 3px; overflow: hidden; } .webuploader-pick-hover { background: #00a2d4; } .webuploader-pick-disable { opacity: 0.6; pointer-events:none; }
.commonWebUploader .queueList { /*margin: 20px;*/ margin-bottom: 15px; border: 3px dashed #e6e6e6; } .commonWebUploader .queueList.filled { /*padding: 17px;*/ margin: 0; border: 3px dashed transparent; } .commonWebUploader .queueList.webuploader-dnd-over { border: 3px dashed #999999; } .commonWebUploader p {margin: 0;} .element-invisible { position: absolute !important; clip: rect(1px 1px 1px 1px); /* IE6, IE7 */ clip: rect(1px,1px,1px,1px); } .commonWebUploader .placeholder { min-height: 200px; padding-top: 100px; text-align: center; background: url(../../img/webuploader.png) center 20px no-repeat; color: #cccccc; font-size: 18px; position: relative; } .commonWebUploader .placeholder .webuploader-pick { font-size: 18px; background: #00b7ee; border-radius: 3px; line-height: 44px; padding: 0 30px; /*width: 120px;*/ color: #fff; display: inline-block; /*margin: 0 auto 20px auto;*/ cursor: pointer; box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); } .commonWebUploader .placeholder .webuploader-pick-hover { background: #00a2d4; } .commonWebUploader .placeholder .flashTip { color: #666666; font-size: 12px; position: absolute; width: 100%; text-align: center; bottom: 20px; } .commonWebUploader .placeholder .flashTip a { color: #0785d1; text-decoration: none; } .commonWebUploader .placeholder .flashTip a:hover { text-decoration: underline; } .commonWebUploader .filelist, .editableGallery .filelist { list-style: none; margin: 0; padding: 0; } .commonWebUploader .filelist:after, .editableGallery .filelist:after { content: ''; display: block; width: 0; height: 0; overflow: hidden; clear: both; } .commonWebUploader .filelist li, .editableGallery .filelist li { width: 110px; height: 110px; background: url(../../img/bg.png) no-repeat; text-align: center; margin: 0 8px 20px 0; position: relative; display: inline; float: left; overflow: hidden; font-size: 12px; } .commonWebUploader .filelist li p.log { position: relative; top: -45px; } .commonWebUploader .filelist li p.title { position: absolute; top: 0; left: 0; width: 100%; overflow: hidden; white-space: nowrap; text-overflow : ellipsis; top: 5px; text-indent: 5px; text-align: left; } .commonWebUploader .filelist li p.progress { position: absolute; width: 100%; bottom: 0; left: 0; height: 8px; overflow: hidden; z-index: 50; margin: 0; border-radius: 0; background: none; -webkit-box-shadow: 0 0 0; } .commonWebUploader .filelist li p.progress span { display: none; overflow: hidden; width: 0; height: 100%; background: #1483d8 url(../../img/progress.png) repeat-x; -webit-transition: width 200ms linear; -moz-transition: width 200ms linear; -o-transition: width 200ms linear; -ms-transition: width 200ms linear; transition: width 200ms linear; -webkit-animation: progressmove 2s linear infinite; -moz-animation: progressmove 2s linear infinite; -o-animation: progressmove 2s linear infinite; -ms-animation: progressmove 2s linear infinite; animation: progressmove 2s linear infinite; -webkit-transform: translateZ(0); } @-webkit-keyframes progressmove { 0% { background-position: 0 0; } 100% { background-position: 17px 0; } } @-moz-keyframes progressmove { 0% { background-position: 0 0; } 100% { background-position: 17px 0; } } @keyframes progressmove { 0% { background-position: 0 0; } 100% { background-position: 17px 0; } } .commonWebUploader .filelist li p.imgWrap, .editableGallery .filelist li p.imgWrap { position: relative; z-index: 2; line-height: 110px; vertical-align: middle; overflow: hidden; width: 110px; height: 110px; -webkit-transform-origin: 50% 50%; -moz-transform-origin: 50% 50%; -o-transform-origin: 50% 50%; -ms-transform-origin: 50% 50%; transform-origin: 50% 50%; -webit-transition: 200ms ease-out; -moz-transition: 200ms ease-out; -o-transition: 200ms ease-out; -ms-transition: 200ms ease-out; transition: 200ms ease-out; } .commonWebUploader .filelist li img, .editableGallery .filelist li img { width: 100%; } .commonWebUploader .filelist li p.error { background: #f43838; color: #fff; position: absolute; bottom: 0; left: 0; height: 28px; line-height: 28px; width: 100%; z-index: 100; } .commonWebUploader .filelist li .success { display: block; position: absolute; left: 0; bottom: 0; height: 40px; width: 100%; z-index: 200; background: url(../../img/success.png) no-repeat right bottom; } .commonWebUploader .filelist div.file-panel, .editableGallery .filelist div.file-panel { position: absolute; height: 0; filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0,startColorstr='#80000000', endColorstr='#80000000')\0; background: rgba( 0, 0, 0, 0.5 ); width: 100%; top: 0; left: 0; overflow: hidden; z-index: 300; } .commonWebUploader .filelist div.file-panel span, .editableGallery .filelist div.file-panel span { width: 24px; height: 24px; display: inline; float: right; text-indent: -9999px; overflow: hidden; background: url(../../img/icons.png) no-repeat; margin: 5px 1px 1px; cursor: pointer; } .commonWebUploader .filelist div.file-panel span.rotateLeft { background-position: 0 -24px; } .commonWebUploader .filelist div.file-panel span.rotateLeft:hover { background-position: 0 0; } .commonWebUploader .filelist div.file-panel span.rotateRight { background-position: -24px -24px; } .commonWebUploader .filelist div.file-panel span.rotateRight:hover { background-position: -24px 0; } .commonWebUploader .filelist div.file-panel span.cancel, .editableGallery .filelist div.file-panel span.cancel { background-position: -48px -24px; } .commonWebUploader .filelist div.file-panel span.cancel:hover, .editableGallery .filelist div.file-panel span.cancel:hover { background-position: -48px 0; } .commonWebUploader .statusBar { height: 55px; border-top: 1px solid #dadada; padding: 0 20px; line-height: 55px; vertical-align: middle; position: relative; } .commonWebUploader .statusBar .progress { border: 1px solid #1483d8; width: 198px; background: #fff; height: 18px; position: relative; display: inline-block; text-align: center; line-height: 20px; color: #6dbfff; position: relative; margin: 0 10px 0 0; } .commonWebUploader .statusBar .progress span.percentage { width: 0; height: 100%; left: 0; top: 0; background: #1483d8; position: absolute; } .commonWebUploader .statusBar .progress span.text { position: relative; z-index: 10; } .commonWebUploader .statusBar .info { display: inline-block; font-size: 14px; color: #666666; } .commonWebUploader .statusBar .btns { position: absolute; top: 10px; right: 20px; line-height: 32px; } .commonWebUploader .statusBar .btns .addFileBtn { display: inline-block; float: left; } .commonWebUploader .statusBar .btns .webuploader-pick, .commonWebUploader .statusBar .btns .uploadBtn, .commonWebUploader .statusBar .btns .uploadBtn.state-uploading, .commonWebUploader .statusBar .btns .uploadBtn.state-paused { background: #ffffff; border: 1px solid #cfcfcf; color: #565656; padding: 0 18px; display: inline-block; border-radius: 3px; margin-left: 10px; cursor: pointer; font-size: 14px; float: left; } .commonWebUploader .statusBar .btns .webuploader-pick-hover, .commonWebUploader .statusBar .btns .uploadBtn:hover, .commonWebUploader .statusBar .btns .uploadBtn.state-uploading:hover, .commonWebUploader .statusBar .btns .uploadBtn.state-paused:hover { background: #f0f0f0; } .commonWebUploader .statusBar .btns .uploadBtn { background: #00b7ee; color: #fff; border-color: transparent; } .commonWebUploader .statusBar .btns .uploadBtn:hover { background: #00a2d4; } .commonWebUploader .statusBar .btns .uploadBtn.disabled { pointer-events: none; opacity: 0.6; }
官网下载一个webuploader.js
自定义editableGallery.js(这个js为编辑图片所用),再引入commonWebUploader.js(我上一篇已经贴出了代码,这个js为上传图片所用)
/* * 可编辑的相册 * */ ( function( $ ) { var EditableGallery = function () { } EditableGallery.prototype.addDeletedUrl = function (deletedUrl) { if (!this.deletedUrls) { this.deletedUrls = []; } this.deletedUrls.push(deletedUrl); } EditableGallery.prototype.getDeletedUrls = function () { return this.deletedUrls; } EditableGallery.prototype.clearDeletedUrls = function () { this.deletedUrls = []; } $.fn.extend({ editableGallery: function( option ) { var defaults = { urls : [], canDelete : false }; var plugin = this; var value, args = Array.prototype.slice.call(arguments, 1); // 样式可以挂到“上传”那边。 function makeGallery($wrap, urls, canDelete) { var data = $wrap.data('editableGallery'); data['clearDeletedUrls'].apply(data); var $fileList = $('<ul class="filelist"></ul>'); $wrap.empty().append($fileList); $.each(urls, function(index, element) { // fancybox放大图片。data-fancybox-group设置为一个独特的值,确保“放大后切换图片时只显示这一组图片”。 var $li = $('<li id="' + index + '">' + '<p class="imgWrap"><a class="fancybox" data-fancybox-group="gallery' + $wrap.attr("id") + '" href="' + element + '"><img src="' + element + '"></a></p>' + '</li>'); if (canDelete) { var $btns = $('<div class="file-panel">' + '<span class="cancel">删除</span>' + '</div>').appendTo( $li ); $li.on( 'mouseenter', function() { $btns.stop().animate({height: 30}); }); $li.on( 'mouseleave', function() { $btns.stop().animate({height: 0}); }); $btns.on( 'click', 'span', function() { var index = $(this).index(); switch ( index ) { case 0: data['addDeletedUrl'].apply(data, [element]); $li.off().find('.file-panel').off().end().remove(); return; } }); } $li.appendTo($fileList); }); } plugin.each( function() { var $this = $( this ), data = $this.data('editableGallery'), options = $.extend(defaults, typeof option === 'object' && option); if ( $this ) { if (typeof option === 'string') { if (!data) { return; } value = data[option].apply(data, args); } else { if (!data) { $this.data('editableGallery', (data = new EditableGallery())); } makeGallery($this, options.urls, options.canDelete); } } }); return typeof value === 'undefined' ? plugin : value; } // end editableGallery }); }( jQuery ));
2.jsp页面
<div id="moduleGallery" class="editableGallery"></div> //存储上次上传的图片 <div id="uploader" class="commonWebUploader"> //提供再次上传 <div class="queueList"> <div id="dndArea" class="placeholder"> <div id="filePicker"></div> <p>或将照片拖到这里,单次最多可选10张</p> <p style="font-size: 12px;margin-top: 2px;">提示:请上传3M以下,格式为jpg、png、bmp格式图片,以保证获得最佳效果</p> </div> </div> <div class="statusBar" style="display:none;"> <div class="progress"> <span class="text">0%</span> <span class="percentage"></span> </div> <div class="info"></div> <div class="btns"> <div id="filePicker2" class="addFileBtn"></div> <!-- <div class="uploadBtn">开始上传</div> --> </div> </div> </div>
3.页面js代码(具体的参数解释,上一篇有介绍),这一部分主要是为了监控什么时候图片全部上传完毕
//上传图片
var wuploader;
$(document).ready(function() {
// 初始化上传插件
initWebUploaderUI();
});
//初始化上传插件
function initWebUploaderUI(){
// WebUploader实例
wuploader = CommonWebUploader.initWebUploader('#uploader', '#filePicker', '#filePicker2', 'uploadModuleOrFunctionFile');
// 所有文件上传结束时
wuploader.on( 'uploadFinished', function() {
var stats = wuploader.getStats();
// 全部上传成功
if (!stats.uploadFailNum) {
alert("保存成功!");
}
});
}
4.点击编辑按钮时展示的数据
function editModule(moduleID){
$.ajax({
cache: true,
type: "POST",
url:"module/getModuleFunctionByID",
data:{
moduleID:moduleID
},
error: function(request) {
alert("连接失败!");
},
success: function(data){
// 现有图片
$('#moduleGallery').editableGallery({
//此处可根据自己的需要进行修改参数,我这里第一个参数:一条数据的ID,第二个参数:这条数据的类型(不需要,可不要),第三个参数:这条数据对应的多张图片的路径集合
urls: handleFileUrl(moduleID, 2, data.moduleFilePathList), //2表示模块:文件类型
canDelete: true //这个参数定义,鼠标移动到图片上时,显示删除按钮 (查看时,不需要编辑图片,可不要这个属性)
});
}
});
}
//请求显示图片的方法(此处存的是绝对路径,文件以流的方式显示在页面)
function handleFileUrl(ownerID,fileType, paths) {
var result = [];
if (paths) {
$.each(paths, function(index, value) {
result.push("seeModuleOrFunctionFile/" + ownerID + "/" +fileType+ "/" + value); //seeModuleOrFunctionFile为后台请求图片的方法
});
}
return result;
}
5.请求显示在页面的方法
/** * @param ownerID (id) * @param fileType:文件类型 * @param fileName:文件名称 * @return * @throws FileNotFoundException */ @RequestMapping(path="/seeModuleOrFunctionFile/{ownerID}/{fileType}/{fileName:[a-zA-Z0-9\\.\\-]+}", method=RequestMethod.GET) public ResponseEntity<InputStreamResource> seeModuleOrFunctionFile(@PathVariable(name="ownerID") String ownerID,@PathVariable(name="fileType") int fileType, @PathVariable(name="fileName") String fileName) throws FileNotFoundException{ // TODO 如果文件不存在?异常处理 Path path; //存储图片的路径,这里存的数据为:一条数据id为文件夹名称,文件夹里面放的此条id对应的多张图片 if(fileType==ProductModuleFunctionFile.TYPE_MODULE){ path = Paths.get(uploadPathProperties.getModuleFile(), ownerID, fileName); //uploadPathProperties中定义实体类,定义一个资源文件test.properties中定义不同的路径(也可在这里直接定义路径) }else{ path = Paths.get(uploadPathProperties.getFunctionFile(), ownerID, fileName); } File file = path.toFile(); String mimeType = URLConnection.guessContentTypeFromName(file.getName()); if (mimeType == null) { mimeType = MediaType.APPLICATION_OCTET_STREAM_VALUE; } HttpHeaders respHeaders = new HttpHeaders(); respHeaders.set(HttpHeaders.CONTENT_TYPE, mimeType); respHeaders.setContentLength(file.length()); String encodedFileName = file.getName(); try { encodedFileName = URLEncoder.encode(encodedFileName, "UTF-8"); } catch (UnsupportedEncodingException e) { logger.error("文件名编码错误!", e); } respHeaders.set(HttpHeaders.CONTENT_DISPOSITION, "inline; filename=\"" + encodedFileName + "\""); InputStreamResource isr = new InputStreamResource(new FileInputStream(file)); return new ResponseEntity<InputStreamResource>(isr, respHeaders, HttpStatus.OK); }
6.编辑完图片后,点击保存按钮时,调用的方法(这里是先保存的其他数据,再保存的上传的图片的数据)
var delUrls = parseUrls($('#moduleGallery').editableGallery('getDeletedUrls')); //保存之前的图片中,被删除的图片的路径
var params={"moduleID":moduleID,"moduleTitle":$("#moduleTitle").val(),"beforeDelPathList":delUrls}; //要传到后台的参数
$.ajax({
cache: true,
type: "POST",
contentType: "application/json;charset=UTF-8",
url:"",
data:JSON.stringify(params),
async: true,
error: function(request) {
alert("修改失败");
},
success: function(){
wuploader.options.formData.ownerID = moduleID; //上传时需要传的参数(仅仅上传,不需要存储其他数据,则不需要传参数)
wuploader.options.formData.fileType = 2;
wuploader.upload(); // 上传文件
}
});
//对图片的路径进行处理(我的数据库里只存了图片的名字)
function parseUrls(fileUrls) {
var result = [];
if (fileUrls) {
$.each(fileUrls, function(index, value) {
result.push(value.substring(value.lastIndexOf("/") + 1));
});
}
return result;
}
7.后台的上传方法,和上一篇是一样的(上一篇中已经贴出代码)(可根据自己的业务逻辑进行修改)
我这里获取之前图片中被删除的图片路径,是为了在后台进行删除数据库中存的图片的数据,和服务器的图片,然后保存再次上传的图片
8.最后点击编辑时显示效果如下,上面是上一次上传的图片,鼠标放上去时,显示删除按钮,可进行删除。下面可再次上传图片