`
amcucn
  • 浏览: 293832 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

类似ajax文件上传功能 其一(只针对同一个页面只有一个上传功能)

阅读更多

写了一个简单的类似ajax上传文件的功能,原理当然不是真正的通过ajax方式上传,而是利用iframe来做的

这是其中的一种写法:

先来分析一下原理,利用js来创建一个iframe,这个iframe的src指向一个静态页面。这个静态页面当中有一个Form表单

进行提交。后台提交成功后让其运行一个父窗口的js函数,并返回上传成功的文件路径、

 

先来看js,由于有一些参数是可变的,所以代码上有些混杂.(程序当中为方便,用到了jquery框架)

 

var Upload = {};
Upload = {
    formId:"D_upload_form",
    imgURL : "http://www.xxxx.com:8080/img",
    action : "/img/upload.htm",
    currentFilePath:null,
    allFilePath:new Array(),
    imgPreDiv:null,
    uploadInfo:null,
    checkType:2,//默认检测类型为图片格式
    imgTemplate:null,   //图片显示模板格式
    maxNum:5,   //最大上传数量
    hasUploadNum:0,//已经上传的数量
    /**
     * 如果需要修改默认参数调用此方法.
     */
    setting:function(uploadURL, upladAction, checkType) {
        Upload.imgURL = uploadURL || Upload.imgURL;
        Upload.action = upladAction || Upload.action;
        Upload.checkType = checkType || Upload.checkType;
    },
    /**
     * 创建文件上传
     * @param fileID 当前file控件ID
     * @param imgListDivId 如果是图片,则可设置图片上传完成后显示的缩略图的位置
     * @param infoId 提示用户正在上传的信息所在的标签ID
     * @param imgTemplate 图片上传后显示的的格式模板,程序根据此模板自动生成后续的图片样式
     */
    createUpload:function(fileID, imgListDivId, infoId, imgTemplate) {
        if (typeof($) != "function") {
            alert("请导入jquery1.2.6以上版本JS文件");
            return;
        }
        var fileInput = $("#" + fileID);
        var iframeWidth = fileInput.parent().css("width") || "250";
        var iframeHeight = fileInput.parent().css("height") || "30";
        var html = "<iframe frameborder='0' id='D_upload_iframe' scrolling='no' src='" + Upload.imgURL
                + "/html/upload.html' width='" + iframeWidth + "' height='" + iframeHeight + "'></iframe>";
        fileInput.parent().html(html);
        if (imgListDivId != null || imgListDivId != "") {
            Upload.imgPreDiv = $("#" + imgListDivId);
        }
        if (infoId != null || infoId != "") {
            Upload.uploadInfo = $("#" + infoId);
        }
        if (imgTemplate != null || imgTemplate != "") {
            Upload.imgTemplate = $("#" + imgTemplate).html();
        }

    },
    /**
     * 供后台程序调用,设置当前上传成功的文件路径
     * @param path 上传后的路径
     */
    setFilePath:function(path) {
        Upload.currentFilePath = path;
        Upload.allFilePath.push(path);
        //var img = "<img src='" + path + "' alt='上传的图片,可删除'/>";
        var img = Upload.imgTemplate.replace("src=\"\"", "src=\"" + path + "\"");
        if (Upload.imgPreDiv != null) {
            Upload.imgPreDiv.append(img);
        }
        history.back();
        Upload.uploadInfo.hide();
    },
    /**
     * 供后台程序调用,当上传出现错误时弹出错误提示框
     * @param error 错误信息
     */
    uploadError:function(error) {
        alert(error);
        history.back();
        Upload.uploadInfo.hide();
    },
    /**
     * 获取当前上传的文件路径
     */
    getFilePath:function() {
        return Upload.currentFilePath;
    },
    /**
     * 显示正在上传信息
     */
    showUploadInfo:function() {
        Upload.uploadInfo.show();
    }
};

上面的JS 方法基本没什么可说的,通过获取当前页面当中的一个input对象,将其替换成一个iframe并保留一些参数

 

 

下面来看iframe静态页面内容:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
        "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <title></title>
    <meta http-equiv="Content-type" content="text/html;chartset=utf-8"/>

</head>
<body style="padding:0;">
<form style="padding:0;" method="post" action="" enctype="multipart/form-data">
    <input type="file" name="fileName" onchange="listernInputChange(this,this.form);"/>
</form>
</body>
<script type="text/javascript">
        function iframeLoad() {
        if (parent.Upload == null || parent.Upload == "undefined") {
            alert("您的设置可能问题,或访问了不该的页面!");
            history.back();
        } else {
            document.forms[0].action = parent.Upload.imgURL + parent.Upload.action;
        }
    }
    function listernInputChange(input, form) {
        var form1 = form || document.forms[0];
        var pattern = /\.(jpg|jpeg|gif|bmp|png)(\s|$)/i;
        if (parent.Upload.checkType == 1) {
            pattern = /\.(css)(\s|$)/i;
        } else if (parent.Upload.checkType == 3) {
            pattern = /\.(swf)(\s|$)/i;
        }
        var url = input.value;
        if (parent.Upload.hasUploadNum < parent.Upload.maxNum) {
            if (!pattern.test(url)) {
                alert("上传的文件格式不正确");
            } else {
                parent.Upload.showUploadInfo();
                form1.submit();
            }
            parent.Upload.hasUploadNum++;
        } else {
            alert("已达到最大上传数量,不可以再上传");
        }
    }
    iframeLoad();
</script>
</html>

iframe页面当中,做了如下事:

1:获取父窗口当中传入的action路径

2:获取用户设置的最大上传数量及上传的文件类型

3:监听浏览按钮的change事件进行表单提交

整个页面调用了父窗口当中的JS函数来获取相关的参数

 

现在来看后台代码:

 protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception {
        String imgPath = "";
        String sectionPath = "";
        String fileName = "";
        StringBuffer uploadError = null;
        try {
            response.setContentType("text/html;charset=UTF-8");
            response.setCharacterEncoding("UTF-8");
            PrintWriter out = response.getWriter();
            //获取当前项目所在的绝对路径
            if (DStringUtil.isEmpty(UploadCtrl.CONTEXT_PATH)) {
                UploadCtrl.CONTEXT_PATH = request.getSession().getServletContext().getRealPath("/");
            }
            //文件保存路径
            String path = request.getParameter("savePath");
            //检测类型
            String checkType = request.getParameter("checkType");
            //默认检测的文件类型为图片格式,可以设置指定类型
            byte cType = UploadUtil.IMG_TYPE;
            if (DStringUtil.isEmpty(path)) {
                path = ConfigUtil.DEFAULT_IMG_PATH;
            }
            if ((!DStringUtil.isEmpty(checkType)) && DStringUtil.isNumber(checkType)) {
                cType = Byte.valueOf(checkType);
            }
            sectionPath = UploadCtrl.CONTEXT_PATH + path;
            uploadError = new StringBuffer(); //保存上传当中的错误信息,有错误时,不回滚
            MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
            MultipartFile file = multipartRequest.getFile("fileName");
            if (file.getSize() > 0) {
                String error = UploadUtil.checkFileExt_SIZE(file, cType, ConfigUtil.MAX_IMG_50K);
                if (DStringUtil.isEmpty(error)) {
                    imgPath = UploadUtil.uploadTempFile(sectionPath, file, CreateCode.getCode());
                    fileName = imgPath;
                    imgPath = imgURL + path + "/" + imgPath;
                }
                uploadError.append(error);
            }
            if (uploadError.length() == 0) {
                //插入图片
                out.println("<html>");
                out.println("<head>");
                out.println("<title>Insert Image</title>");
                out.println("<meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\">");
                out.println("</head>");
                out.println("<body>");
                out.println("<script type=\"text/javascript\">parent.Upload.setFilePath(\"" + imgPath + "\")</script>");
                out.println("</body>");
                out.println("</html>");
            } else {
                out.println("<html>");
                out.println("<head>");
                out.println("<title>error</title>");
                out.println("<meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\">");
                out.println("</head>");
                out.println("<body>");
                out.println("<script type=\"text/javascript\">parent.Upload.uploadError(\"" + uploadError.toString() + "\");</script>");
                out.println("</body>");
                out.println("</html>");
            }
        } catch (Exception e) {
            logger.error("上传图片:" + e);
            if (!DStringUtil.isEmpty(imgPath)) {
                UploadUtil.deleteFile(sectionPath + "/" + fileName);
            }
            throw e;
        } finally {
            if (uploadError != null && !DStringUtil.isEmpty(uploadError.toString())) {
                UploadUtil.deleteFile(sectionPath + "/" + fileName);
            }
        }
        return null;
    }

 

以上代码当中用了一些工具类,在这里并未给出,重点的是看后面上传成功后如果让其将路径返回给父窗口

查看其中的红色代码,这里利用response写入一段代码,并让其运行父窗口当中的方法,通过传参的方式,将文件路径告之父窗口。

 

来看演示HTML:

    <script type="text/javascript">
        $(function() {
            //创建上传文件,及处理上传成功后的操作
            Upload.createUpload("imgFile", "imgList", "D_upload_label_info", "ImageTemplate");
          //Upload.createUpload("imgFile2", "imgList2", "", "");

        });
    </script>


<%--图片显示模板格式--%>
<div id="ImageTemplate">
    <div>
        <img src="" alt="图片位置"/></div>
</div>
<%--图片显示位置--%>
<div id="imgList" style="height:150px;">

</div>
<div style="height:30px;">
    <%--只是一个占位符--%>
    <input id="imgFile" type="file" name="imgFile"/>
</div>
<div>
    <label id="D_upload_label_info" style="display:none;">正在上传....</label>
</div>

<div>
    <input id="imgFile2" type="file" name="imgFile"/>
</div>
<%--图片显示位置--%>
<div id="imgList2" style="height:150px;">
  </div>

 

 

 

以上就是整个上传的过程。

不足之处:目前在同一个页面只能有一个上传的文件选择框,不能有多个不同提交路径及不同参数的上传框。

 

 

 

0
0
分享到:
评论

相关推荐

    ajax+jquery+flash进度条的文件图片上传完返回上传路劲完美例子

    本示例“ajax+jquery+flash进度条的文件图片上传完返回上传路劲完美例子”着重展示了如何结合AJAX、jQuery和Flash技术实现一个高效的文件上传功能,特别是针对图片文件,并且具有进度条显示以及解决乱码问题。...

    ajax文件上传

    这里我们讨论的是“伪Ajax文件上传”这一主题,它主要针对JavaScript实现的文件上传功能,特别是考虑了对Firefox和IE8浏览器的兼容性。 文件上传在Web应用中是一个常见的需求,传统方式通常是通过表单提交,页面会...

    asp.net 超大文件上传,带进度条源码,亲测能用

    针对超大文件上传的需求,开发者通常需要采取一些策略来优化和扩展这一功能,同时加入进度条显示可以提升用户体验。 标题中提到的"asp.net 超大文件上传,带进度条源码",主要涉及以下知识点: 1. **文件分块上传**...

    带进度条大文件上传源码(单文件多文件都可以传) v2.0.rar

    【标题】"带进度条大文件上传源码(单文件多文件都可以传) v2.0.rar" 提供的是一个基于.Net技术实现的文件上传解决方案,特别针对大文件和批量文件上传进行了优化,并且带有进度条显示,为用户提供更好的交互体验。...

    大文件分片上传,大视频等.zip

    在IT行业中,大文件上传和处理是一个常见的挑战,特别是在视频分享和云存储服务中。"大文件分片上传,大视频等.zip" 这个压缩包文件提供了针对此类问题的一个解决方案,它涉及到HTML、PHP以及可能的前端JavaScript...

    仿163网盘无刷新文件上传 for Jsp

    "仿163网盘无刷新文件上传 for Jsp"是一个针对JSP(JavaServer Pages)开发的项目,旨在实现类似网易163网盘的无刷新文件上传体验。这个项目的核心目标是提供一个用户友好的界面,允许用户在不刷新整个页面的情况下...

    Microsoft ASP.NET 2.0 AJAX Extensions 1.0

    ASP.NET 2.0 AJAX Extensions是微软为.NET Framework 2.0引入的一个重要组件,旨在增强Web应用程序的用户体验,通过实现部分页面更新(Partial Page Rendering)和异步交互,提供与JavaScript库(如Prototype或...

    仿163网盘无刷新文件上传 for JSP

    本项目“仿163网盘无刷新文件上传 for JSP”就是针对这一需求而设计的,主要利用JavaServer Pages(JSP)技术实现,结合前端JavaScript和Ajax技术,实现文件的异步上传。 首先,我们需要理解JSP的基本概念。JSP是...

    AspNET上传大文件的NeatUpload中文文档

    默认的Progress.aspx页面就是ProgressPage的一个实例,它通过数据绑定表达式与UploadHttpModule通信,更新DetailsSpan和DetailsDiv控件,实现AJAX无刷新更新。 使用NeatUpload需要满足以下条件: 1. .NET Framework...

    java版头像上传缩放裁剪功能

    这个java版的头像上传裁剪功能是针对.NET版本的一个补充,提供了完整的Java实现方案。下面我们将详细探讨相关的知识点。 1. **文件上传** 文件上传通常使用Servlet API或者第三方库如Apache Commons FileUpload来...

    基于PHP的仿163网盘无刷新文件上传 for Php.zip

    【标题】"基于PHP的仿163网盘无刷新文件上传 for Php.zip"是一个针对PHP开发者的资源,旨在实现类似163网盘的无刷新文件上传功能。这一技术通常涉及前端与后端的交互,以提供用户友好的、流畅的文件上传体验,而无需...

    Ajax2.0全新实例+代码

    2. **AjaxFileUpload**:提供了一个支持多文件上传的控件,用户可以选择多个文件并异步上传,无需等待页面刷新。 3. **AutoCompleteExtender**:类似于搜索引擎的自动填充功能,用户在输入框中输入时,控件会根据...

    基于ASP的进度条上传文件系统.zip

    【标题】"基于ASP的进度条上传文件系统"是一个针对Web开发的项目,它利用了Active Server Pages(ASP)技术来实现文件上传功能,并且在上传过程中提供了进度条展示,提高了用户体验。ASP是Microsoft推出的一种服务器...

    仿1网盘无刷新文件上传 for Jsp_fileupload_jsp毕业设计—(包含完整源码可运行).rar

    这个项目的核心目标是提供一个类似于163网盘的用户体验,即在不刷新整个页面的情况下完成文件上传操作,提升了用户的交互体验。 在JSP(JavaServer Pages)中,文件上传功能通常通过Apache的Commons FileUpload库来...

    仿126风格的附件上传

    【标题】"仿126风格的附件上传"是一个针对多附件异步上传功能的实现,它借鉴了126邮箱的用户界面和交互设计,旨在提供一种友好且高效的文件上传体验。这一技术通常用于网站或应用中,让用户能够方便地上传多个文件,...

    【实战篇】第14篇:CLTPHP_v5.5.3 前台任意文件上传漏洞1

    针对这个漏洞,修复建议包括:首先,应该增加上传页面的认证机制,只允许特定的用户或经过身份验证的用户进行文件上传;其次,应限制上传目录的执行权限,防止上传的脚本被直接执行。这样的修复措施可以有效地防止...

    仿qq相册源码ajax_js

    综上所述,"仿qq相册源码ajax_js"是一个利用AJAX和JavaScript技术实现的动态相册系统,它通过模仿QQ相册的特性,提供了一种无刷新、交互性强的图片浏览和管理体验。这个源码对于学习和实践Web前端开发,尤其是AJAX和...

    jsp头像上传仿flash效果

    【标题】"jsp头像上传仿flash效果"指的是在JavaServer Pages (JSP) 中实现一个用户头像上传的功能,并且这个功能在视觉效果上模仿了经典的Flash技术。Flash曾经是网页动态效果和多媒体交互的主要工具,但在现代网页...

    兼容ie8的上传源码

    总的来说,"兼容ie8的上传源码"是一个针对旧版浏览器的文件上传解决方案,它利用了当时的技术,如IFrame、ActiveX控件,以及传统的表单提交,以实现与现代浏览器类似的功能。理解并分析这样的源码可以帮助我们更好地...

    基于AJAX和SSH集成框架的国有资产管理系统

    Struts2框架简化了开发流程,支持拦截器、文件上传、国际化等功能。 3. **Spring**: - Spring是一个轻量级的Java EE全栈框架,提供了丰富的功能集,包括依赖注入(DI)、面向切面编程(AOP)、事务管理等。Spring...

Global site tag (gtag.js) - Google Analytics