`
amcucn
  • 浏览: 291461 次
  • 性别: 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
分享到:
评论

相关推荐

    JAVA上百实例源码以及开源项目

    5个目标文件,演示Address EJB的实现,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口...

    大名鼎鼎SWFUpload- Flash+JS 上传

     SWFUpload是一个客户端文件上传工具,最初由Vinterwebb.se开发,它通过整合Flash与JavaScript技术为WEB开发者提供了一个具有丰富功能继而超越传统标签的文件上传模式。 [编辑本段]SWFUpload的主要特点  * 可以...

    基于asp.net的网络硬盘

    66.内含ajax文件操作技术,更加提高用户体验,提高系统运行效率。 67.支持客户端软件管理。 68.分简体版、繁体版、英文版三种版本。 69.可与《桃源相册管理系统》的用户进行整合。 70.标签及用户和文件信息的参数...

    桃源网络硬盘.Net v5.8.zip

    桃源网络硬盘支持文件目录多级共享,树状显示系统功能和目录结构,操作方便,拥有上传码功能、文件提取功能、文件转发功能、好友功能等等,详细功能请看以下介绍。   桃源网络硬盘.Net简介: 1.多用户注册各自...

    JAVA上百实例源码以及开源项目源代码

    5个目标文件,演示Address EJB的实现,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口...

    桃源网络硬盘ASP.NET版

    66.内含ajax文件操作技术,更加提高用户体验,提高系统运行效率。 67.支持客户端软件管理。 68.分简体版、繁体版、英文版三种版本。 69.可与《桃源相册管理系统》的用户进行整合。 70.标签及用户和文件信息的参数...

    桃源网络硬盘.Net v5.4 for .net 2.0/3.0/3.5

    66.内含ajax文件操作技术,更加提高用户体验,提高系统运行效率。 67.支持客户端软件管理。 68.分简体版、繁体版、英文版三种版本。 69.可与《桃源相册管理系统》的用户进行整合。 70.标签及用户和文件信息的参数...

    桃源网络硬盘.Net v5.5.rar

    内含ajax文件操作技术,更加提高用户体验,提高系统运行效率。 68.支持客户端软件管理。 69.分简体版、繁体版、英文版三种版本。 70.可与《桃源相册管理系统》的用户进行整合。 71.全面的整合接口,支持注册、登录、...

    桃园网络硬盘4.2

    支持 SERV-U FTP服务器上传下载 功能列表 ... 2.在自己的空间中上传多文件及...58.内含ajax文件操作技术,更加提高用户体验,提高系统运行效率。 59.支持客户端软件管理。 60.分简体版、繁体版、英文版三种版本。

    桃源网络硬盘.Net5.5

    66.内含ajax文件操作技术,更加提高用户体验,提高系统运行效率。 67.支持客户端软件管理。 68.分简体版、繁体版、英文版三种版本。 69.可与《桃源相册管理系统》的用户进行整合。 70.标签及用户和文件信息的参数...

    桃源网络硬盘v5.8

    66.内含ajax文件操作技术,更加提高用户体验,提高系统运行效率。 67.支持客户端软件管理。 68.分简体版、繁体版、英文版三种版本。 69.可与《桃源相册管理系统》的用户进行整合。 70.标签及用户和文件信息的参数...

    桃源网络硬盘.Net v5.2

    内含ajax文件操作技术,更加提高用户体验,提高系统运行效率。 67.支持客户端软件管理。 68.分简体版、繁体版、英文版三种版本。 69.可与《桃源相册管理系统》的用户进行整合。 70.标签及用户和文件信息...

    图片管理系统(桃源相册管理)

    58.内含ajax文件操作技术,更加提高用户体验,提高系统运行效率。 59.分简体版、繁体版、英文版三种版本。 60.可以和《桃源网络硬盘.Net》用户完全整合。 61.全面的整合接口,支持注册、登录、修改资料及密码、...

    基于J2EE框架的个人博客系统项目毕业设计论文(源码和论文)

    Tomcat是一个免费的开源的Serlvet容器,在Tomcat中,应用程序的部署很简单,你只需将你的WAR放到Tomcat的webapp目录下,Tomcat会自动检测到这个文件,并将其解压。你在浏览器中访问这个应用的Jsp时,通常第一次会很...

    DophinPHP快速开发框架 v1.3.3.zip

    数据列表集成类似EXCEL的快速筛选、排序、模糊搜索、AJAX编辑等功能,表单页集成常用的文本、下拉框、单选、多选、关键词、编辑器、文件上传、图片上传、图片裁切等控件,除此之外,您还可以灵活的扩展自己的控件,...

    桃源相册管理系统v2.3

    v2.2 官方免费版 ] 《桃源相册管理系统》是一款专业的图片存储展示平台,可用于图片的共享、交流、管理、服务等,适合拥有大量图片的网站,能够独立成站或帮助网站实现图片文件的上传、分类组织、相册结集等功能,...

    DolpinPHP快速开发框架 v1.0.0.zip

    数据列表集成类似EXCEL的快速筛选、排序、模糊搜索、AJAX编辑等功能,表单页集成常用的文本、下拉框、单选、多选、关键词、编辑器、文件上传、图片上传、图片裁切等控件,除此之外,您还可以灵活的扩展自己的控件,...

    LED装饰公司网站 v1.0.zip

    内容复制功能,可在列表中复制一条内容,添加类似内容时更方便。 内容另存功能,可以将内容编辑后另存为一条新内容。 内容排序功能,可以自由设置内容显示的前后顺序。 任意设置的会员级别和浏览权限精确到每...

    工商注册代理公司网站 v1.0.zip

    内容复制功能,可在列表中复制一条内容,添加类似内容时更方便。 内容另存功能,可以将内容编辑后另存为一条新内容。 内容排序功能,可以自由设置内容显示的前后顺序。 任意设置的会员级别和浏览权限精确到每...

Global site tag (gtag.js) - Google Analytics