摘要:上传成功后可以进行业务的下一步操作,自己根据业务写吧后台代码接收前端的文件数据添加图例开始添加图例结束该图例名称已经存在高级基本自定义添加成功添加失败再往后和数据库的交互我就不写了小菜一枚,不正确之处请批评指正
如题,图片批量上传,效果如图所示
上代码
HTML
jquery多文件上传插件 jquery多文件上传插件效果演示
jquery.imageuploader.js
/* * ©2016 Quicken Loans Inc. All rights reserved. */ /* global jQuery FormData FileReader */ (function ($) { $.fn.uploader = function (options, testMode) { return this.each(function (index) { options = $.extend({ submitButtonCopy: "上传选定的文件", instructionsCopy: "支持拖放", furtherInstructionsCopy: "你也可以删除文件", selectButtonCopy: "选择文件", secondarySelectButtonCopy: "选择多个文件", dropZone: $(this), fileTypeWhiteList: ["jpg", "png", "jpeg", "gif", "pdf"], badFileTypeMessage: "对不起,我们不能接受这种类型的文件。", ajaxUrl: "/images/add", testMode: false }, options); var state = { fileBatch: [], isUploading: false, isOverLimit: false, listIndex: 0 }; // create DOM elements var dom = { uploaderBox: $(this), submitButton: $(""), instructions: $("" + options.instructionsCopy + "
"), selectButton: $("" + ""), secondarySelectButton: $("" + ""), fileList: $("
" + options.furtherInstructionsCopy + "
") }; // empty out whatever is in there dom.uploaderBox.empty(); // create and attach UI elements setupDOM(dom); // set up event handling bindUIEvents(); function setupDOM (dom) { dom.contentsContainer .append(dom.instructions) .append(dom.selectButton); dom.furtherInstructions .append(dom.secondarySelectButton); dom.uploaderBox .append(dom.fileList) .append(dom.contentsContainer) .append(dom.submitButton) .after(dom.furtherInstructions); } function bindUIEvents () { // handle drag and drop options.dropZone.on("dragover dragleave", function (e) { e.preventDefault(); e.stopPropagation(); }); $.event.props.push("dataTransfer"); // jquery bug hack options.dropZone.on("drop", selectFilesHandler); // hack for being able selecting the same file name twice dom.selectButton.on("click", function () { this.value = null; }); dom.selectButton.on("change", selectFilesHandler); dom.secondarySelectButton.on("click", function () { this.value = null; }); dom.secondarySelectButton.on("change", selectFilesHandler); // handle the submit click dom.submitButton.on("click", uploadSubmitHandler); // remove link handler dom.uploaderBox.on("click", ".js-upload-remove-button", removeItemHandler); // expose handlers for testing if (options.testMode) { options.dropZone.on("uploaderTestEvent", function (e) { switch (e.functionName) { case "selectFilesHandler": selectFilesHandler(e); break; case "uploadSubmitHandler": uploadSubmitHandler(e); break; default: break; } }); } } function addItem (file) { //var fileName = cleanName(file.name); var fileName = file.name; var fileSize = file.size; var id = state.listIndex; var sizeWrapper; var fileNameWrapper = $("" + fileName + ""); state.listIndex++; var listItem = $(""); var thumbnailContainer = $(""); var thumbnail = $(""); var removeLink = $(""); // validate the file if (options.fileTypeWhiteList.indexOf(getExtension(file.name).toLowerCase()) !== -1) { // file is ok, add it to the batch state.fileBatch.push({file: file, id: id, fileName: fileName, fileSize: fileSize, groups:groups}); sizeWrapper = $("" + formatBytes(fileSize) + ""); } else { // file is not ok, only add it to the dom sizeWrapper = $("" + options.badFileTypeMessage + ""); } // create the thumbnail, if you can if (window.FileReader && file.type.indexOf("image") !== -1) { var reader = new FileReader(); reader.onloadend = function () { thumbnail.attr("src", reader.result); thumbnail.parent().find("i").remove(); }; reader.onerror = function () { thumbnail.remove(); }; reader.readAsDataURL(file); } else if (file.type.indexOf("image") === -1) { thumbnail = $(""); } thumbnailContainer.append(thumbnail); listItem.append(thumbnailContainer); listItem .append(fileNameWrapper) .append(sizeWrapper) .append(removeLink); dom.fileList.append(listItem); } function getExtension (path) { var basename = path.split(/[/]/).pop(); var pos = basename.lastIndexOf("."); if (basename === "" || pos < 1) { return ""; } return basename.slice(pos + 1); } function formatBytes (bytes, decimals) { if (bytes === 0) return "0 Bytes"; var k = 1024; var dm = decimals + 1 || 3; var sizes = ["Bytes", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"]; var i = Math.floor(Math.log(bytes) / Math.log(k)); return (bytes / Math.pow(k, i)).toPrecision(dm) + " " + sizes[i]; } function cleanName (name) { name = name.replace(/s+/gi, "-"); // Replace white space with dash return name.replace(/[^a-zA-Z0-9.-]/gi, ""); // Strip any special characters } function uploadSubmitHandler () { if (state.fileBatch.length !== 0) { var groups = $("#groups option:selected").val(); var data = new FormData(); for (var i = 0; i < state.fileBatch.length; i++) { //data.append("files[]", state.fileBatch[i].file, groups+state.fileBatch[i].fileName); data.append("files[]", state.fileBatch[i].file); } data.append("group", groups); $.ajax({ type: "POST", url: options.ajaxUrl, data:data, cache: false, contentType: false, /*enctype: "multipart/form-data",*/ processData: false, success : function(result) { //上传成功后可以进行业务的下一步操作,自己根据业务写吧 } }); } } function selectFilesHandler (e) { e.preventDefault(); e.stopPropagation(); if (!state.isUploading) { // files come from the input or a drop var files = e.target.files || e.dataTransfer.files || e.dataTransfer.getData; // process each incoming file for (var i = 0; i < files.length; i++) { addItem(files[i]); } } renderControls(); } function renderControls () { if (dom.fileList.children().size() !== 0) { dom.submitButton.removeClass("uploader__hide"); dom.furtherInstructions.removeClass("uploader__hide"); dom.contentsContainer.addClass("uploader__hide"); } else { dom.submitButton.addClass("uploader__hide"); dom.furtherInstructions.addClass("uploader__hide"); dom.contentsContainer.removeClass("uploader__hide"); } } function removeItemHandler (e) { e.preventDefault(); if (!state.isUploading) { var removeIndex = $(e.target).data("index"); removeItem(removeIndex); $(e.target).parent().remove(); } renderControls(); } function removeItem (id) { // remove from the batch for (var i = 0; i < state.fileBatch.length; i++) { if (state.fileBatch[i].id === parseInt(id)) { state.fileBatch.splice(i, 1); break; } } // remove from the DOM dom.fileList.find("li[data-index="" + id + ""]").remove(); } }); }; }(jQuery));css
styles.imageuploader.css
@charset "UTF-8"; /*! * ©2016 Quicken Loans Inc. All rights reserved. */ /*! normalize.css v4.1.1 | MIT License | github.com/necolas/normalize.css */ /** * 1. Change the default font family in all browsers (opinionated). * 2. Prevent adjustments of font size after orientation changes in IE and iOS. */ html { font-family: sans-serif; /* 1 */ -ms-text-size-adjust: 100%; /* 2 */ -webkit-text-size-adjust: 100%; /* 2 */ } /** * Remove the margin in all browsers (opinionated). */ body { margin: 0; } /* HTML5 display definitions ========================================================================== */ /** * Add the correct display in IE 9-. * 1. Add the correct display in Edge, IE, and Firefox. * 2. Add the correct display in IE. */ article, aside, details, figcaption, figure, footer, header, main, menu, nav, section, summary { /* 1 */ display: block; } /** * Add the correct display in IE 9-. */ audio, canvas, progress, video { display: inline-block; } /** * Add the correct display in iOS 4-7. */ audio:not([controls]) { display: none; height: 0; } /** * Add the correct vertical alignment in Chrome, Firefox, and Opera. */ progress { vertical-align: baseline; } /** * Add the correct display in IE 10-. * 1. Add the correct display in IE. */ template, [hidden] { display: none; } /* Links ========================================================================== */ /** * 1. Remove the gray background on active links in IE 10. * 2. Remove gaps in links underline in iOS 8+ and Safari 8+. */ a { background-color: transparent; /* 1 */ -webkit-text-decoration-skip: objects; /* 2 */ } /** * Remove the outline on focused links when they are also active or hovered * in all browsers (opinionated). */ a:active, a:hover { outline-width: 0; } /* Text-level semantics ========================================================================== */ /** * 1. Remove the bottom border in Firefox 39-. * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. */ abbr[title] { border-bottom: none; /* 1 */ text-decoration: underline; /* 2 */ text-decoration: underline dotted; /* 2 */ } /** * Prevent the duplicate application of `bolder` by the next rule in Safari 6. */ b, strong { font-weight: inherit; } /** * Add the correct font weight in Chrome, Edge, and Safari. */ b, strong { font-weight: bolder; } /** * Add the correct font style in Android 4.3-. */ dfn { font-style: italic; } /** * Correct the font size and margin on `h1` elements within `section` and * `article` contexts in Chrome, Firefox, and Safari. */ h1 { font-size: 2em; margin: 0.67em 0; } /** * Add the correct background and color in IE 9-. */ mark { background-color: #ff0; color: #000; } /** * Add the correct font size in all browsers. */ small { font-size: 80%; } /** * Prevent `sub` and `sup` elements from affecting the line height in * all browsers. */ sub, sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; } sub { bottom: -0.25em; } sup { top: -0.5em; } /* Embedded content ========================================================================== */ /** * Remove the border on images inside links in IE 10-. */ img { border-style: none; } /** * Hide the overflow in IE. */ svg:not(:root) { overflow: hidden; } /* Grouping content ========================================================================== */ /** * 1. Correct the inheritance and scaling of font size in all browsers. * 2. Correct the odd `em` font sizing in all browsers. */ code, kbd, pre, samp { font-family: monospace, monospace; /* 1 */ font-size: 1em; /* 2 */ } /** * Add the correct margin in IE 8. */ figure { margin: 1em 40px; } /** * 1. Add the correct box sizing in Firefox. * 2. Show the overflow in Edge and IE. */ hr { box-sizing: content-box; /* 1 */ height: 0; /* 1 */ overflow: visible; /* 2 */ } /* Forms ========================================================================== */ /** * 1. Change font properties to `inherit` in all browsers (opinionated). * 2. Remove the margin in Firefox and Safari. */ button, input, select, textarea { font: inherit; /* 1 */ margin: 0; /* 2 */ } /** * Restore the font weight unset by the previous rule. */ optgroup { font-weight: bold; } /** * Show the overflow in IE. * 1. Show the overflow in Edge. */ button, input { /* 1 */ overflow: visible; } /** * Remove the inheritance of text transform in Edge, Firefox, and IE. * 1. Remove the inheritance of text transform in Firefox. */ button, select { /* 1 */ text-transform: none; } /** * 1. Prevent a WebKit bug where (2) destroys native `audio` and `video` * controls in Android 4. * 2. Correct the inability to style clickable types in iOS and Safari. */ button, html [type="button"], [type="reset"], [type="submit"] { -webkit-appearance: button; /* 2 */ } /** * Remove the inner border and padding in Firefox. */ button::-moz-focus-inner, [type="button"]::-moz-focus-inner, [type="reset"]::-moz-focus-inner, [type="submit"]::-moz-focus-inner { border-style: none; padding: 0; } /** * Restore the focus styles unset by the previous rule. */ button:-moz-focusring, [type="button"]:-moz-focusring, [type="reset"]:-moz-focusring, [type="submit"]:-moz-focusring { outline: 1px dotted ButtonText; } /** * Change the border, margin, and padding in all browsers (opinionated). */ fieldset { border: 1px solid #c0c0c0; margin: 0 2px; padding: 0.35em 0.625em 0.75em; } /** * 1. Correct the text wrapping in Edge and IE. * 2. Correct the color inheritance from `fieldset` elements in IE. * 3. Remove the padding so developers are not caught out when they zero out * `fieldset` elements in all browsers. */ legend { box-sizing: border-box; /* 1 */ color: inherit; /* 2 */ display: table; /* 1 */ max-width: 100%; /* 1 */ padding: 0; /* 3 */ white-space: normal; /* 1 */ } /** * Remove the default vertical scrollbar in IE. */ textarea { overflow: auto; } /** * 1. Add the correct box sizing in IE 10-. * 2. Remove the padding in IE 10-. */ [type="checkbox"], [type="radio"] { box-sizing: border-box; /* 1 */ padding: 0; /* 2 */ } /** * Correct the cursor style of increment and decrement buttons in Chrome. */ [type="number"]::-webkit-inner-spin-button, [type="number"]::-webkit-outer-spin-button { height: auto; } /** * 1. Correct the odd appearance in Chrome and Safari. * 2. Correct the outline style in Safari. */ [type="search"] { -webkit-appearance: textfield; /* 1 */ outline-offset: -2px; /* 2 */ } /** * Remove the inner padding and cancel buttons in Chrome and Safari on OS X. */ [type="search"]::-webkit-search-cancel-button, [type="search"]::-webkit-search-decoration { -webkit-appearance: none; } /** * Correct the text style of placeholders in Chrome, Edge, and Safari. */ ::-webkit-input-placeholder { color: inherit; opacity: 0.54; } /** * 1. Correct the inability to style clickable types in iOS and Safari. * 2. Change font properties to `inherit` in Safari. */ ::-webkit-file-upload-button { -webkit-appearance: button; /* 1 */ font: inherit; /* 2 */ } .button, .uploader__file-label, .uploader__submit-button { background-color: white; background-color: transparent; border: 2px solid #ff8598; border-radius: 5px; color: #ff8598; display: block; font-size: 0.8em; padding: 1em 2em; max-width: 15em; text-transform: uppercase; transition: background-color 0.2s; } .button:hover, .uploader__file-label:hover, .uploader__submit-button:hover, .button:active, .uploader__file-label:active, .uploader__submit-button:active, .button:focus, .uploader__file-label:focus, .uploader__file-input:focus + .uploader__file-label, .uploader__submit-button:focus { background-color: #ff8598; color: white; } .button--secondary { color: #ff8598; border-color: #ff8598; padding: 0.5em 1em; max-width: 15em; } .button--secondary:hover, .button--secondary:active, .button--secondary:focus, .uploader__file-input:focus + .uploader__file-label { background-color: #ff8598; color: white; } .button--inline { display: inline-block; } .button--big-bottom, .uploader__submit-button { max-width: none; width: 100%; text-align: center; border-radius: 0; background-color: #ff8598; color: white; } .button--big-bottom:hover, .uploader__submit-button:hover, .button--big-bottom:active, .uploader__submit-button:active, .button--big-bottom:focus, .uploader__submit-button:focus { background-color: #ffb8c3; } .icon-button, .uploader__icon-button { background: transparent; border: 0; color: #d2d2d2; } .icon-button:hover, .uploader__icon-button:hover { color: #424242; } * { box-sizing: border-box; } body { background-color: #e6e6e6; } .site-header::after { content: ""; clear: both; display: table; } .uploader__file-input { height: 0.1px; opacity: 0; overflow: hidden; position: absolute; width: 0.1px; z-index: -1; } .hide, .uploader__hide { display: none; } .show { display: block; } .error, .uploader__error { color: #ff3264; } .file-list, .uploader__file-list { list-style-type: none; width: 100%; padding: 0; margin: 0; } .file-list__item, .uploader__file-list__item { display: table; padding: 0.5em; width: 100%; } .file-list__item:nth-child(2n), .uploader__file-list__item:nth-child(2n) { background-color: #fff5f7; } .file-list__thumbnail, .uploader__file-list__thumbnail, .file-list__text, .uploader__file-list__text, .file-list__size, .uploader__file-list__size, .file-list__button, .uploader__file-list__button { display: table-cell; vertical-align: middle; } .file-list__thumbnail, .uploader__file-list__thumbnail { width: 10%; } .file-list__text, .uploader__file-list__text { width: 60%; word-break: break-word; } .file-list__size, .uploader__file-list__size { width: 25%; } .file-list__button, .uploader__file-list__button { width: 5%; } .icon, .uploader__icon { font-size: 2em; margin: 10px; text-decoration: none; } .icon--close { color: #d2d2d2; } .icon--spinner, .uploader__icon--spinner { margin: 1em; } .thumbnail { max-height: 50px; max-width: 50px; height: auto; width: auto; padding: 0.2em; } body { font-family: "Source Sans Pro", sans-serif; font-size: 1em; } h1, h2, h3, h4, h5, h6 { font-family: "Source Sans Pro", sans-serif; margin: 0; } h1, .primary-heading { font-size: 2em; } h2, .secondary-heading { font-size: 1.8em; } h3, .tertiary-heading { font-size: 1.5em; } h4, h5, h6 { font-size: 1.2em; } .text--important, .uploader__instructions { font-size: 1.2em; } .l-main { max-width: 64em; margin-left: auto; margin-right: auto; } .l-main:after { content: " "; display: block; clear: both; } .l-site-title { width: 100%; float: left; margin-left: 0; margin-right: 0; margin-left: 8.47458%; } .l-center-box { width: 66.10169%; float: left; margin-right: 1.69492%; margin-left: 16.94915%; } .site-header { margin-bottom: 3em; } .site-title { color: #ff8598; font-size: 0.8em; padding: 1.5em 0; text-transform: uppercase; } .uploader__box { animation: appear 1s; background-color: white; box-shadow: -2px 2px 20px #d2d2d2; text-align: center; transition: all 0.5s; margin-bottom: 1em; } @keyframes appear { from { margin-top: 3em; opacity: 0; } to { margin-top: 0; opacity: 1; } } .uploader__contents { padding: 3em; margin-top: 0; opacity: 1; transition: all 0.4s; } .uploader__file-label, .uploader__box .button--secondary { margin: 2em auto; } .uploader__file-label--secondary { display: inline-block; margin: 0 0.5em; } .uploader__further-instructions { margin-left: 16.94915%; clear: both; color: #969696; font-size: 0.9em; padding: 0.5em; }
demo.css
body, html { font-size: 100%; padding: 0; margin: 0;} /* Reset */ *, *:after, *:before { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } /* Clearfix hack by Nicolas Gallagher: http://nicolasgallagher.com/micro-clearfix-hack/ */ .clearfix:before, .clearfix:after { content: " "; display: table; } .clearfix:after { clear: both; } body{ font-weight: 500; font-size: 1.05em; font-family: "Microsoft YaHei","Segoe UI", "Lucida Grande", Helvetica, Arial,sans-serif; }
normalize.css
article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block;}audio,canvas,video{display:inline-block;}audio:not([controls]){display:none;height:0;}[hidden]{display:none;}html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;}body{margin:0;}a:focus{outline:thin dotted;}a:active,a:hover{outline:0;}h1{font-size:2em;margin:0.67em 0;}abbr[title]{border-bottom:1px dotted;}b,strong{font-weight:bold;}dfn{font-style:italic;}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0;}mark{background:#ff0;color:#000;}code,kbd,pre,samp{font-family:monospace,serif;font-size:1em;}pre{white-space:pre-wrap;}q{quotes:"201C" "201D" "2018" "2019";}small{font-size:80%;}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline;}sup{top:-0.5em;}sub{bottom:-0.25em;}img{border:0;}svg:not(:root){overflow:hidden;}figure{margin:0;}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em;}legend{border:0;padding:0;}button,input,select,textarea{font-family:inherit;font-size:100%;margin:0;}button,input{line-height:normal;}button,select{text-transform:none;}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer;}button[disabled],html input[disabled]{cursor:default;}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0;}input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box;}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none;}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0;}textarea{overflow:auto;vertical-align:top;}table{border-collapse:collapse;border-spacing:0;}
后台代码接收前端的文件数据
@RequestMapping(value = "/add") public void add(@RequestParam("files[]") MultipartFile[] file,String group,Model model,HttpServletRequest request, HttpServletResponse response) throws IOException { log.info("添加图例开始"); MapresultMap = imagesService.add(file,group); response.setContentType("application/json; charset=UTF-8"); response.getWriter().write(new Gson().toJson(resultMap)); log.info("添加图例结束"); }
@Override public Mapadd(MultipartFile[] MultipartFile, String group) { Map resultMap = new HashMap<>(); String path = ""; try { for (int i = 0; i < MultipartFile.length; i++) { MultipartFile file = MultipartFile[i]; String fileName = file.getOriginalFilename(); long fileSize = file.getSize(); ImageInfo ImageFind = imageInfoMapper.selectByPrimaryKey(fileName); if (ImageFind != null) { resultMap.put("message", "该图例名称已经存在"); resultMap.put("success", false); return resultMap; } ImageInfo imageInfo = new ImageInfo(); if (group.equals("1")) { imageInfo.setGroups("高级"); path = updatepath + "/advanced/" + fileName; } else if (group.equals("3")) { imageInfo.setGroups("基本"); path = updatepath + "/base/" + fileName; } else { imageInfo.setGroups("自定义"); path = updatepath + "/customize/" + fileName; } log.info("path:"+path); File f = new File(path); if (!f.getParentFile().exists()) f.getParentFile().mkdirs(); file.transferTo(f); imageInfo.setName(fileName); imageInfo.setPath(path); imageInfo.setSize(Double.valueOf(fileSize)); int j = imageInfoMapper.insert(imageInfo); boolean result = (j == 0) ? false : true; resultMap.put("message", (result) ? "添加成功" : "添加失败"); resultMap.put("success", result); resultMap.put("resultCode", "00000003"); resultMap.put("time", CommonUtil.getSimpleFormatTimestamp()); } } catch (Exception e) { e.printStackTrace(); return null; } return resultMap; }
再往后和数据库的交互我就不写了
小菜一枚,不正确之处请批评指正
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/54015.html
摘要:上传成功后可以进行业务的下一步操作,自己根据业务写吧后台代码接收前端的文件数据添加图例开始添加图例结束该图例名称已经存在高级基本自定义添加成功添加失败再往后和数据库的交互我就不写了小菜一枚,不正确之处请批评指正 如题,图片批量上传,效果如图所示showImg(https://segmentfault.com/img/remote/1460000019409059); showImg(h...
摘要:上传成功后可以进行业务的下一步操作,自己根据业务写吧后台代码接收前端的文件数据添加图例开始添加图例结束该图例名称已经存在高级基本自定义添加成功添加失败再往后和数据库的交互我就不写了小菜一枚,不正确之处请批评指正 如题,图片批量上传,效果如图所示showImg(https://segmentfault.com/img/remote/1460000019409059); showImg(h...
摘要:默认为选择上传的文件数超出了允许的最大限制。在这种情况下,每一个人选择的文件被上传成功后,触发事件。此事件仅在上传和完成同步或异步批量上传后触发。 下载地址、API和DOM地址(英语好的小伙伴可以看看) 下载地址:https://github.com/kartik-v/b...API文档 :http://plugins.krajee.com/fil...D E M O:http://p...
阅读 734·2019-08-29 12:49
阅读 3512·2019-08-29 11:32
阅读 3399·2019-08-26 10:43
阅读 2387·2019-08-23 16:53
阅读 2003·2019-08-23 15:56
阅读 1659·2019-08-23 12:03
阅读 2749·2019-08-23 11:25
阅读 2056·2019-08-22 15:11