• 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 id="imgPreview" style='500px; height:400px;'> 
                    <img src=""/> 
                </div> 
            </center>
        </body> 
    </html> 

    2.spring配置文件添加支持文件上传

    <!-- 支持上传文件 -->
        <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/>

    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 id="' + frameId + '" name="' + frameId + '" style="position:absolute; top:-9999px; left:-9999px"';
            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 + '" id="' + formId + '" enctype="multipart/form-data"></form>');
            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;
        }
  • 相关阅读:
    Auto Generate Reflection Information for C++
    面向嵌入式的JavaScript引擎
    如何在unity3d的UGUI中给Text添加材质和艺术字
    获取Unity GLES版本
    PBR原理
    Unity双开
    Unity Shader各种效果
    Redis是什么
    其他地方拷贝过来的VS项目一直报错不能启动IIS
    IIS部署PHP项目并与mysql完美结合
  • 原文地址:https://www.cnblogs.com/gisblogs/p/5035483.html
Copyright © 2020-2023  润新知