如题,图片批量上传,效果如图所示
上代码HTML
<!DOCTYPE html><html lang="zh"><head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>jquery多文件上传插件</title> <link rel="stylesheet" type="text/css" href="css/normalize.css" /> <link rel="stylesheet" type="text/css" href="css/demo.css"> <link href="dist/styles.imageuploader.css" rel="stylesheet" type="text/css"> </head><body> <section role="main" class="l-main" style="margin-top:50px;margin-bottom:50px;"> <header class="site-header"> <h1 class="site-title l-site-title" style="font-size:1.2em;">jquery多文件上传插件效果演示</h1> </header> <div class="uploader__box js-uploader__box l-center-box"> <form action="#" method="POST"> <div class="uploader__contents"> <label class="button button--secondary" for="fileinput">请选择文件</label> <input id="fileinput" class="uploader__file-input" type="file" multiple value="Select Files"> </div> <input class="button button--big-bottom" type="submit" value="Upload Selected Files"> </form> </div> </section> <script src="js/jquery-1.11.0.min.js" type="text/javascript"></script> <script src="dist/jquery.imageuploader.js" type="text/javascript"></script> <script type="text/javascript"> (function(){ var options = {}; $('.js-uploader__box').uploader({ 'selectButtonCopy':'请选择或拖拽文件', 'instructionsCopy':'你可以选择或拖拽多个文件', 'submitButtonCopy':'上传选择的文件', 'furtherInstructionsCopy':'你可以选择或拖拽更多的文件', 'secondarySelectButtonCopy':'选择更多的文件', }); }()); </script> </body></html>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: $('<button class="js-uploader__submit-button uploader__submit-button uploader__hide">' + options.submitButtonCopy + '<i class="js-uploader__icon fa fa-upload uploader__icon"></i></button>'), instructions: $('<p class="js-uploader__instructions uploader__instructions">' + options.instructionsCopy + '</p>'), selectButton: $('<input style="height: 0; width: 0;" id="fileinput' + index + '" type="file" multiple class="js-uploader__file-input uploader__file-input">' + '<label for="fileinput' + index + '" style="cursor: pointer;" class="js-uploader__file-label uploader__file-label">' + options.selectButtonCopy + '</label>'), secondarySelectButton: $('<input style="height: 0; width: 0;" id="secondaryfileinput' + index + '" type="file"' + ' multiple class="js-uploader__file-input uploader__file-input">' + '<label for="secondaryfileinput' + index + '" style="cursor: pointer;" class="js-uploader__file-label uploader__file-label uploader__file-label--secondary">' + options.secondarySelectButtonCopy + '</label>'), fileList: $('<ul class="js-uploader__file-list uploader__file-list"></ul>'), contentsContainer: $('<div class="js-uploader__contents uploader__contents"></div>'), furtherInstructions: $('<p class="js-uploader__further-instructions uploader__further-instructions uploader__hide">' + options.furtherInstructionsCopy + '</p>') }; // 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 = $('<span class="uploader__file-list__text">' + fileName + '</span>'); state.listIndex++; var listItem = $('<li class="uploader__file-list__item" data-index="' + id + '"></li>'); var thumbnailContainer = $('<span class="uploader__file-list__thumbnail"></span>'); var thumbnail = $('<img class="thumbnail"><i class="fa fa-spinner fa-spin uploader__icon--spinner"></i>'); var removeLink = $('<span class="uploader__file-list__button"><button class="uploader__icon-button js-upload-remove-button fa fa-times" data-index="' + id + '"></button></span>'); // 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 = $('<span class="uploader__file-list__size">' + formatBytes(fileSize) + '</span>'); } else { // file is not ok, only add it to the dom sizeWrapper = $('<span class="uploader__file-list__size"><span class="uploader__error">' + options.badFileTypeMessage + '</span></span>'); } // 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 = $('<i class="fa fa-file-o uploader__icon">'); } 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));cssstyles.imageuploader.css
...