Jquery_AjaxFileUpload插件的使用記錄
功能需求:Spring MVC框架下,實現無刷新頁面上傳圖片,并展示圖片預覽效果
直接上代碼:
1.圖片預覽效果
<%@ page contentType="text/html;charset=UTF-8"%> <html> <head> <title>本地圖片上傳預覽</title> <script> function PreviewImage(imgFile) { var pattern = /(\.*.jpg$)|(\.*.png$)|(\.*.jpeg$)|(\.*.gif$)|(\.*.bmp$)/; if(!pattern.test(imgFile.value)) { alert("系統僅支持jpg/jpeg/png/gif/bmp格式的照片!"); imgFile.focus(); } else { var path; if(document.all)//IE { imgFile.select(); path = document.selection.createRange().text; document.getElementById("imgPreview").innerHTML=""; document.getElementById("imgPreview").style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled='true',sizingMethod='scale',src=\"" + path + "\")";//使用濾鏡效果 } else//FF { path = URL.createObjectURL(imgFile.files[0]); document.getElementById("imgPreview").innerHTML = "<img src='"+path+"'/>"; } } } </script> </head> <body> <center> <input type="file" onchange='PreviewImage(this)' /> <div > <img src=""/> </div> </center> </body> </html>
2.spring配置文件添加支持文件上傳
<!-- 支持上傳文件 --> <bean />
3.調用ajaxFileUpload插件
/** * 企業用戶注冊 * @param registerObj * @param RegisterJs */ companyRegister: function (registerObj, RegisterJs) { var phone = registerObj.phone; // 手機號 var password = registerObj.password; // 密碼 var email = registerObj.email; // 郵箱(登錄用戶名) var company = registerObj.company; // 公司名稱 var companyAddress = registerObj.companyAddress; // 公司詳細地址 var companyEmail = registerObj.companyEmail; // 企業郵箱 var companyPhone = registerObj.companyPhone; // 企業電話 var companyWebsite = registerObj.companyWebsite; // 公司網址 var userType = registerObj.userType; // 0:個人 1:企業 $.ajaxFileUpload({ url: ctx + '/Register/companyRegister.action', //用于文件上傳的服務器端請求地址 data: { phone: phone, password: password, email: email, company: company, companyAddress: companyAddress, companyEmail: companyEmail, companyPhone: companyPhone, companyWebsite: companyWebsite, userType: userType }, secureuri: false, //是否需要安全協議,一般設置為false fileElementId: 'licenseImg', //文件上傳域的ID dataType: 'json', //返回值類型 一般設置為json success: function (data, status) { //服務器成功響應處理函數 if (data) { var status = data.status; var errorMsg = data.errorMsg; if (status == 1) { RegisterJs.changeStep(3); } else { showMessage(errorMsg); } } else { showMessage("系統異常,請聯系管理員!"); } }, error: function (data, status, e) {//服務器響應失敗處理函數 showMessage(e); } }); }
4.修改ajaxFileUpload.js文件中Json處理代碼
uploadHttpData: function (r, type) { var data = !type; data = type == "xml" || data ? r.responseXML : r.responseText; // If the type is "script", eval it in global context if (type == "script") jQuery.globalEval(data); // Get the JavaScript object, if JSON is used. if (type == "json") data = r.responseText; var start = data.indexOf(">"); if (start != -1) { var end = data.indexOf("<", start + 1); if (end != -1) { data = data.substring(start + 1, end); } } eval("data = " + data); // evaluate scripts within html if (type == "html") jQuery("<div>").html(data).evalScripts(); return data; }
*關鍵部分:
if (type == "json") data = r.responseText; var start = data.indexOf(">"); if (start != -1) { var end = data.indexOf("<", start + 1); if (end != -1) { data = data.substring(start + 1, end); } } eval("data = " + data);
ajaxFileUpload.js全部源碼:
jQuery.extend({ createUploadIframe: function (id, uri) { //create frame var frameId = 'jUploadFrame' + id; var iframeHtml = '<iframe >; if (window.ActiveXObject) { if (typeof uri == 'boolean') { iframeHtml += ' src="' + 'javascript:false' + '"'; } else if (typeof uri == 'string') { iframeHtml += ' src="' + uri + '"'; } } iframeHtml += ' />'; jQuery(iframeHtml).appendTo(document.body); return jQuery('#' + frameId).get(0); }, createUploadForm: function (id, fileElementId, data, fileElement) { //create form var formId = 'jUploadForm' + id; var fileId = 'jUploadFile' + id; var form = jQuery('<form action="" method="POST" name="' + formId + '" >); if (data) { for (var i in data) { jQuery('<input type="hidden" name="' + i + '" value="' + data[i] + '" />').appendTo(form); } } var oldElement; if (fileElement == null) oldElement = jQuery('#' + fileElementId); else oldElement = fileElement; var newElement = jQuery(oldElement).clone(); jQuery(oldElement).attr('id', fileId); jQuery(oldElement).before(newElement); jQuery(oldElement).appendTo(form); //set attributes jQuery(form).css('position', 'absolute'); jQuery(form).css('top', '-1200px'); jQuery(form).css('left', '-1200px'); jQuery(form).appendTo('body'); return form; }, ajaxFileUpload: function (s) { // TODO introduce global settings, allowing the client to modify them for all requests, not only timeout s = jQuery.extend({}, jQuery.ajaxSettings, s); var id = new Date().getTime() var form = jQuery.createUploadForm(id, s.fileElementId, (typeof(s.data) == 'undefined' ? false : s.data), s.fileElement); var io = jQuery.createUploadIframe(id, s.secureuri); var frameId = 'jUploadFrame' + id; var formId = 'jUploadForm' + id; // Watch for a new set of requests if (s.global && !jQuery.active++) { jQuery.event.trigger("ajaxStart"); } var requestDone = false; // Create the request object var xml = {} if (s.global) jQuery.event.trigger("ajaxSend", [xml, s]); // Wait for a response to come back var uploadCallback = function (isTimeout) { var io = document.getElementById(frameId); try { if (io.contentWindow) { xml.responseText = io.contentWindow.document.body ? io.contentWindow.document.body.innerHTML : null; xml.responseXML = io.contentWindow.document.XMLDocument ? io.contentWindow.document.XMLDocument : io.contentWindow.document; } else if (io.contentDocument) { xml.responseText = io.contentDocument.document.body ? io.contentDocument.document.body.innerHTML : null; xml.responseXML = io.contentDocument.document.XMLDocument ? io.contentDocument.document.XMLDocument : io.contentDocument.document; } } catch (e) { jQuery.handleError(s, xml, null, e); } if (xml || isTimeout == "timeout") { requestDone = true; var status; try { status = isTimeout != "timeout" ? "success" : "error"; // Make sure that the request was successful or notmodified if (status != "error") { // process the data (runs the xml through httpData regardless of callback) var data = jQuery.uploadHttpData(xml, s.dataType); // If a local callback was specified, fire it and pass it the data if (s.success) s.success(data, status); // Fire the global callback if (s.global) jQuery.event.trigger("ajaxSuccess", [xml, s]); } else jQuery.handleError(s, xml, status); } catch (e) { status = "error"; jQuery.handleError(s, xml, status, e); } // The request was completed if (s.global) jQuery.event.trigger("ajaxComplete", [xml, s]); // Handle the global AJAX counter if (s.global && !--jQuery.active) jQuery.event.trigger("ajaxStop"); // Process result if (s.complete) s.complete(xml, status); jQuery(io).unbind() setTimeout(function () { try { jQuery(io).remove(); jQuery(form).remove(); } catch (e) { jQuery.handleError(s, xml, null, e); } }, 100) xml = null } } // Timeout checker if (s.timeout > 0) { setTimeout(function () { // Check to see if the request is still happening if (!requestDone) uploadCallback("timeout"); }, s.timeout); } try { var form = jQuery('#' + formId); jQuery(form).attr('action', s.url); jQuery(form).attr('method', 'POST'); jQuery(form).attr('target', frameId); if (form.encoding) { jQuery(form).attr('encoding', 'multipart/form-data'); } else { jQuery(form).attr('enctype', 'multipart/form-data'); } jQuery(form).submit(); } catch (e) { jQuery.handleError(s, xml, null, e); } jQuery('#' + frameId).load(uploadCallback); return { abort: function () { try { jQuery('#' + frameId).remove(); jQuery(form).remove(); } catch (e) { } } }; }, uploadHttpData: function (r, type) { var data = !type; data = type == "xml" || data ? r.responseXML : r.responseText; // If the type is "script", eval it in global context if (type == "script") jQuery.globalEval(data); // Get the JavaScript object, if JSON is used. if (type == "json") data = r.responseText; var start = data.indexOf(">"); if (start != -1) { var end = data.indexOf("<", start + 1); if (end != -1) { data = data.substring(start + 1, end); } } eval("data = " + data); // evaluate scripts within html if (type == "html") jQuery("<div>").html(data).evalScripts(); return data; }, handleError: function (s, xml, status, e) { // If a local callback was specified, fire it if (s.error) s.error(xml, status, e); // Fire the global callback if (s.global) jQuery.event.trigger("ajaxError", [xml, s, e]); } });
5.后臺處理
/** * 企業用戶注冊 * * @param response * @param user */ @RequestMapping("/companyRegister") public void companyRegister(@RequestParam(value = "licenseImg", required = true) MultipartFile licenseImg, HttpServletResponse response, HttpServletRequest request, User user) { String email = user.getEmail(); JSONObject jsonObject = new JSONObject(); try { String fileName = uploadImg(request, licenseImg, user.getEmail()); if(StringUtils.isNotEmpty(fileName)){ user.setBusinessLicense(fileName); } userService.save(user); removeAuthCode(email); jsonObject.put("status", "1"); jsonObject.put("errorMsg", "發送成功"); response.getWriter().print(jsonObject); } catch (Exception e) { logger.error("企業用戶注冊異常【" + email + "】:", e); } } /** * 保存圖片 * * @param request * @param licenseImg * @param email * @return */ public String uploadImg(HttpServletRequest request, MultipartFile licenseImg, String email) { SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd"); try { String path = request.getSession().getServletContext().getRealPath("upload"); String dateFolder = format.format(new Date()); path += File.separator + dateFolder; String fileName = licenseImg.getOriginalFilename(); String suffix = fileName.substring(fileName.lastIndexOf(".")); fileName = UUID.randomUUID() + suffix; File targetFile = new File(path, fileName); if (!targetFile.exists()) { targetFile.mkdirs(); } //保存圖片 licenseImg.transferTo(targetFile); return "/" + dateFolder + "/" + fileName; } catch (Exception e) { logger.error("上傳營業執照異常【" + email + "】:", e); } return null; }