Ajax实现文件上传带进度条效果功能

这次给大家带来Ajax实现文件上传进度条效果功能,Ajax实现文件上传带进度条效果的注意事项有哪些,下面就是实战案例,一起来看一下。

1.概述

在实际的Web应该开发或网站开发过程中,经常需要实现文件上传的功能。在文件上传过程中,经常需要用户进行长时间的等待,为了让用户及时了解上传进度,可以在上传文件的同时,显示文件的上传进度条。运行本实例,如图1所示,访问文件上传页面,单击“浏览”按钮选择要上传的文件,注意文件不能超过50MB,否则系统将给出错误提示。选择完要上传的文件后,单击“提交”按钮,将会上传文件并显示上传进度。

2.技术要点

主要是应用开源的Common-FileUpload组件来实现分段文件上传,从而实现在上传过程中,不断获取上传进度。下面对Common-FileUpload组件进行详细介绍。

Common-FileUpload组件时Apache组织下的jakarta-commons项目下的一个子项目,该组件可以方便地将multipart/form-data类型请求中的各种表单域解析出来。该组件需要另一个名为Common-IO的组件的支持。这两个组件包文件可以到http://commons.apache.org网站上进行下载。

(1)创建上传对象

在应该Common-FileUpload组件实现文件上传时,需要创建一个工厂对象,并根据该工厂对象创建一个新的文件上传对象,具体代码如下:

DiskFileItemFactory factory = new DiskFileItemFactory();ServletFileUpload upload = new ServletFileUpload(factory);

登录后复制

(2)解析上传请求

创建一个文件上传对象后,就可以应用该对象来解析上传请求,获取全部的表单项,可以通过文件上传对象的parseRequest()方法来实现。parseRequest()方法的语法结构如下:

public List parseRequest(HttpServletRequest request) throws FileUploadException

登录后复制

(3)FileItem类

在Common-FileUpload组件中,无论是文件域还是普通表单域,都当成FileItem对象来处理。如果该对象的isFormField()方法返回值为true,则表示是一个普通表单域,否则为一个文件域。在实现文件上传时,可以通过FileItem类的getName()方法获得上传文件的文件名,通过getSize()方法获得上传文件的大小。

3.具体实现

(1)创建request.js文件,在该文件中编写Ajax请求方法。

(2)新建文件上传页index.jsp,在该页中添加用于获得上传文件信息的表单以及表单元素,并添加用于显示进度条的

标签和显示百分比的标签,关键代码如下:


登录后复制

请选择上传的文件:

注:文件大小请控制在50M以内。

Ajax实现文件上传带进度条效果功能

0%

登录后复制

(3)新建上传文件的Servlet实现类UpLpad。在该类中编写实现文件上传的方法uploadFile(),在该方法中通过Common-FileUpload组件实现分段上传文件,并计算上传百分比,实时保存到Session中,关键代码如下:

public void uploadFile(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType("text/html;charset=GBK");request.setCharacterEncoding("GBK");HttpSession session=request.getSession();session.setAttribute("progressBar",0); //定义指定上传进度的Session变量String error = "";int maxSize=50*1024*1024; //单个上传文件大小的上限DiskFileItemFactory factory = new DiskFileItemFactory(); //创建工厂对象ServletFileUpload upload = new ServletFileUpload(factory); //创建一个新的文件上传对象try {List items = upload.parseRequest(request); // 解析上传请求Iterator itr = items.iterator(); // 枚举方法while (itr.hasNext()) {FileItem item = (FileItem) itr.next(); //获取FileItem对象if (!item.isFormField()) { // 判断是否为文件域if (item.getName() != null && !item.getName().equals("")) {//是否选择了文件long upFileSize=item.getSize(); //上传文件的大小String fileName=item.getName(); //获取文件名if(upFileSize>maxSize){error="您上传的文件太大,请选择不超过50M的文件";break;}// 此时文件暂存在服务器的内存中File tempFile = new File(fileName); //构造文件目录临时对象String uploadPath = this.getServletContext().getRealPath("/upload");File file = new File(uploadPath,tempFile.getName()); InputStream is=item.getInputStream();int buffer=1024; //定义缓冲区的大小int length=0;byte[] b=new byte[buffer];double percent=0;FileOutputStream fos=new FileOutputStream(file);while((length=is.read(b))!=-1){percent+=length/(double)upFileSize*100D; //计算上传文件的百分比fos.write(b,0,length); //向文件输出流写读取的数据session.setAttribute("progressBar",Math.round(percent)); }fos.close();Thread.sleep(1000); //线程休眠1秒} else {error="没有选择上传文件!";}}}} catch (Exception e) {e.printStackTrace();error = "上传文件出现错误:" + e.getMessage();}if (!"".equals(error)) {request.setAttribute("error", error);request.getRequestDispatcher("error.jsp").forward(request, response);}else {request.setAttribute("result", "文件上传成功!");request.getRequestDispatcher("upFile_deal.jsp").forward(request, response);}}

登录后复制

(4)在文件上传页index.jsp中,导入编写的Ajax请求方法的request.js文件,并编写获取上传进度的Ajax请求方法和Ajax回调函数,关键代码如下:

var request = false;function getProgress(){ var url="showProgress.jsp"; //服务器地址var param ="nocache="+new Date().getTime(); //每次请求URL参数都不同 ,避免上传时进度条不动request=httpRequest("post",url,true,callbackFunc,param); //调用请求方法 }//Ajax回调函数function callbackFunc(){if( request.readyState==4 ){ //判断响应是否完成 if( request.status == 200 ){ //判断响应是否成功var h = request.responseText; //获得返回的响应数据,该数据位上传进度百分比h=h.replace(/s/g,""); //去除字符串中的Unicode空白符document.getElementById("progressPercent").style.display=""; //显示百分比 progressPercent.innerHTML=h+"%"; //显示完成的百分比document.getElementById("progressBar").style.display="block"; //显示进度条document.getElementById("imgProgress").width=h*(235/100); //显示完成的进度}}}

登录后复制

(5)编写showProgress.jsp页面,在该页中应用EL表达式输出保存在session域中的上传进度条的值,具体代码如下:

${progressBar}

登录后复制

(6)编写表单提交按钮onclick事件所调用的JavaScript方法,在该方法通过window对象的setInterval()方法每隔一定时间请求一次服务器,获得最新的上传进度,关键代码如下:

function deal(form){form.submit(); //提交表单timer=window.setInterval("getProgress()",500); //每隔500毫秒获取一次上传进度}

登录后复制

相信看了本文案例你已经掌握了方法,更多精彩请关注【创想鸟】其它相关文章!

推荐阅读:

$.Ajax()方法的参数如何使用

ajax怎么对xml文件进行增删改查

以上就是Ajax实现文件上传带进度条效果功能的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2775283.html

(0)
上一篇 2025年3月8日 14:24:39
下一篇 2025年3月8日 14:24:47

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • Nginx实现AJAX跨域请求图文详解(附代码)

    这次给大家带来Nginx实现AJAX跨域请求图文详解(附代码),Nginx实现AJAX跨域请求的注意事项有哪些,下面就是实战案例,一起来看一下。 AJAX从一个域请求另一个域会有跨域的问题。那么如何在nginx上实现ajax跨域请求呢?要在…

    编程技术 2025年3月8日
    200
  • 使用Nginx避免ajax的跨域请求

    这次给大家带来使用Nginx避免ajax的跨域请求,使用Nginx避免ajax的跨域请求的注意事项有哪些,下面就是实战案例,一起来看一下。 服务器上 nginx + tomcat ,其中 nginx 监听 80 端口, tomcat 监听 …

    编程技术 2025年3月8日
    200
  • 怎么实现不刷新的Ajax分页

    这次给大家带来怎么实现不刷新的Ajax分页,实现不刷新Ajax分页的注意事项有哪些,下面就是实战案例,一起来看一下。 紧接着上篇—分页技术原理与实现之Java+Oracle代码实现分页(二) ,本篇继续分析分页技术。上篇讲的是分页技术的代码…

    编程技术 2025年3月8日
    200
  • ajax的应用实战解析

    这次给大家带来ajax的应用实战解析,ajax应用实战的注意事项有哪些,下面就是实战案例,一起来看一下。 AJAX即“Asynchronous Javascript And XML”(异步JavaScript和XML),是指一种创建交互式网…

    编程技术 2025年3月8日
    200
  • ajax内部值无法在外部调用的解决方法

    这次给大家带来ajax内部值无法在外部调用的解决方法,解决ajax内部值无法在外部调用的注意事项有哪些,下面就是实战案例,一起来看一下。 ajax内部值外部调用不了的原因及解决方法 var id=‘123′;$.ajax({ url:’ht…

    编程技术 2025年3月8日
    200
  • Ajax异步上传文件实列(附代码)

    这次给大家带来Ajax异步上传文件实列(附代码),Ajax异步上传文件的注意事项有哪些,下面就是实战案例,一起来看一下。 非常不多说,直接给大家上干货,写的不好还请见谅。 具体代码如下所示: Index$(function() {$(‘:b…

    编程技术 2025年3月8日
    200
  • ajax访问到Session失效如何处理

    这次给大家带来ajax访问到Session失效如何处理,处理ajax访问到Session失效的注意事项有哪些,下面就是实战案例,一起来看一下。 最近由于一个项目,模块切换为ajax请求数据,当Session失效后,ajax请求后没有返回值,…

    2025年3月8日
    200
  • ajax操作全局监测,用户session失效怎么处理

    这次给大家带来ajax操作全局监测,用户session失效怎么处理,处理ajax操作全局监测,用户session失效的注意事项有哪些,下面就是实战案例,一起来看一下。 ajax 操作全局监测,用户session失效的解决方法 jQuery(…

    编程技术 2025年3月8日
    200
  • Ajax跨域请求如何使用

    这次给大家带来Ajax跨域请求如何使用,使用Ajax跨域请求的注意事项有哪些,下面就是实战案例,一起来看一下。 本篇将讲述一个小白从遇到跨域不知道是跨域问题,到知道是跨域问题不知道如何解决,再到解决跨域问题,最后找到两种方法解决ajax 跨…

    编程技术 2025年3月8日
    200
  • Jsonp解决ajax的跨域问题

    这次给大家带来Jsonp解决ajax的跨域问题,Jsonp解决ajax跨域问题的注意事项有哪些,下面就是实战案例,一起来看一下。 一、介绍 最近跨域问题比较多,而且自己刚好也看到这一块,就总结了一下,关于JSONP的东西百度的话东西确实很多…

    2025年3月8日 编程技术
    200

发表回复

登录后才能评论