二、插件引入
<link type="text/css" rel="stylesheet" href="${ctx}/components/fileinput/css/fileinput.css" />
<script type="text/javascript" src="${ctx}/components/fileinput/js/fileinput.js"></script>
<script type="text/javascript" src="${ctx}/components/fileinput/js/fileinput_locale_zh.js"></script>
http://plugins.krajee.com/file-input,这是其官方文档,里面有下载地址。
三、页面
<input type="file" name="image" class="projectfile" value="${deal.image}"/>
1. type=file和class=projectfile,指明其为input file类型。
2. name指定其在后台的获取key。
3. value指定其在展示的时候图片路径。
四、页面加载时执行
projectfileoptions : { showUpload : false, showRemove : false, language : "zh", allowedPreviewTypes : [ "image" ], allowedFileExtensions : [ "jpg", "png", "gif" ], maxFileSize : 2000, },// 文件上传框$("input[class=projectfile]").each(function() { var imageurl = $(this).attr("value"); if (imageurl) { var op = $.extend({ initialPreview : [ // 预览图片的设置 "<img src="" + imageurl + "" class="file-preview-image">", ] }, projectfileoptions); $(this).fileinput(op); } else { $(this).fileinput(projectfileoptions); }});1. 通过jquery获取对应的input file,然后执行fileinput方法。
<form class="form-horizontal required-validate" action="${ctx}/save?callbackType=confirmTimeoutForward" enctype="multipart/form-data" method="post" onsubmit="return iframeCallback(this, pageAjaxDone)"> <div class="form-group"> <label for="" class="col-md-1 control-label">项目封面</label> <div class="col-md-10 tl th"> <input type="file" name="image" class="projectfile" value="${deal.image}" /> <p class="help-block">支持jpg、jpeg、png、gif格式,大小不超过2.0M</p> </div> </div><div class="form-group text-center "> <div class="col-md-10 col-md-offset-1"> <button type="submit" class="btn btn-primary btn-lg">保存</button> </div> </div></form>1.enctype=”multipart/form-data”必不可少。
function pageAjaxDone(json) { YUNM.debug(json); YUNM.ajaxDone(json); if (json[YUNM.keys.statusCode] == YUNM.statusCode.ok) { var msg = json[YUNM.keys.message]; // 弹出消息提示 YUNM.debug(msg); if (YUNM.callbackType.confirmTimeoutForward == json.callbackType) { $.showSuccessTimeout(msg, function() { window.location = json.forwardUrl; }); } }}其主要的功能就是通过ajaxDone方法处理服务端传递过来的错误消息,假如说服务端操作成功,那么会显示提示信息,进而跳转到对应的url。
也就是说,我们希望此时的“所有文件”处不是“所有文件”,而是“image”之类的。显然这样的逻辑并没有错,但却不适合bootstrap fileinput!
那么,这个时候我就很容易认为“allowedFileTypes” 没有起到作用!
但请看下图:
吼吼,原来是在你选择了文件后发生的类型检查!
②、allowedFileTypes工作原理
$(this).fileinput({ showUpload : false, showRemove : false, language : "zh", allowedPreviewTypes: ["image"], allowedFileTypes: ["image"], allowedFileExtensions: ["jpg", "png"], maxFileSize : 2000, });通过fileinput方法我们加载一个bootstrap fileinput组件,那么其内部是如何实现allowedFileTypes的呢?
var node = ctr + i, previewId = previewInitId + "-" + node, isText, file = files[i],caption = self.slug(file.name), fileSize = (file.size || 0) / 1000, checkFile, fileExtExpr = "",previewData = objUrl.createObjectURL(file), fileCount = 0, j, msg, typ, chk,fileTypes = self.allowedFileTypes, strTypes = isEmpty(fileTypes) ? "" : fileTypes.join(", "),fileExt = self.allowedFileExtensions, strExt = isEmpty(fileExt) ? "" : fileExt.join(", ");然后我们继续看到如下的代码:
if (!isEmpty(fileTypes) && isArray(fileTypes)) { for (j = 0; j < fileTypes.length; j += 1) {typ = fileTypes[j];checkFile = settings[typ];chk = (checkFile !== undefined && checkFile(file.type, caption));fileCount += isEmpty(chk) ? 0 : chk.length; } if (fileCount === 0) {msg = self.msgInvalidFileType.replace("{name}", caption).replace("{types}", strTypes);self.isError = throwError(msg, file, previewId, i);return; }}我们可以发现,文件类型的检查是发生在checkFile方法上,那么checkFile方法到底做了些什么呢?
defaultFileTypeSettings = {image: function (vType, vName) { return (vType !== undefined) ? vType.match("image.*") : vName.match(/.(png|jpe?g)$/i);},...以上就是checkFile的内容。
$(this).fileinput({showUpload : false,showRemove : false,language : "zh",allowedPreviewTypes: ["image"],allowedFileExtensions: ["jpg", "png"],maxFileSize : 2000, });fileinput组件此时指定的属性如上,没有了“allowedFileTypes”,并且指定允许的后缀类型为“[‘jpg", ‘png"]”,也就是说,假如我们选择了gif的图片就会出现错误提示。
错误预期的发生了,那么请特别注意:
image: function (vType, vName) { return (vType !== undefined) ? vType.match("image.*") : vName.match(/.(png|jpe?g)$/i);},fileinput.js文件中原始的代码如下:
image: function (vType, vName) { return (vType !== undefined) ? vType.match("image.*") : vName.match(/.(gif|png|jpe?g)$/i);},image类型的后缀当然默认包含了gif,我只是为了举例说明,代码做了调整,请注意!