`
So懒
  • 浏览: 3640 次
  • 性别: Icon_minigender_1
  • 来自: 长春
文章分类
社区版块
存档分类
最新评论

Java Web开发中上传文件进度条的实现

阅读更多
    今天登陆一个php论坛,发现上传附件时,显示了文件上传的进度条,记起自己以前也研究过在J2EE下上传文件显示进度条的问题,现在整理一下,希望对以后遇到这方面问题的人能够有所帮助。
    获取文件上传的进度主要有二个问题需要解决,一个是上传文件后向服务器获取当前文件传输进度的问题,另一个就是服务器如何计算当前文件的传输进度。
    第一个问题很好解决,通过异步请求不断的向服务器请求文件上传的进度直到文件上传完毕就可以了。主要是如何解决第二个问题。
    现在第三方文件上传的组件很多,如commons-fileupload和cos等,不管用哪一个组件,都是以http协议为基础的,而在Servlet当中,服务器接收的任何数据,都是使用ServletInputStream来读取的,第三方的文件上传组件也是一样的。那么我们可以做一个ServletInputStream的代理类,在读取方法中记录读取数据的字节数,需要注意要区分不同的用户来记录
public ServletInputStreamProxy(ServletInputStream in,
            UploadFileObserver observer) {
        this.in = in;
        this.observer = observer;
}
public int read(byte[] b, int off, int len) throws IOException {
        int r = in.read(b, off, len);
        if (r != -1) {
            observer.markUploadSize(r);
        }
        return r;
}

通过上面的代码,我们可以在文件上传的时候,通过代理的ServletInputStream来记录服务器端读取到的文件字节数,但只代理ServletInputStream还不行,因为ServletInputStream是由HttpServletRequest获取的,所以我们还需要代理HttpServletRequest,这里可以用动态代理或者代理HttpServletRequestWrapper,下面给出代理HttpServletRequestWrapper的代码
public class HttpServletRequestProxy extends HttpServletRequestWrapper {
    
    private UploadFileObserver observer;
    public HttpServletRequestProxy(HttpServletRequest request,UploadFileObserver observer) {
        super(request);
        this.observer = observer;
    }

    /* (non-Javadoc)
     * @see javax.servlet.ServletRequestWrapper#getInputStream()
     */
    public ServletInputStream getInputStream() throws IOException {
        ServletInputStream in = super.getInputStream();
        return new ServletInputStreamProxy(in,observer);
    }
}

之后我们在使用第三方组件上传文件的时候,需要用HttpServletRequestProxy代替HttpServletRequest
下面是使用cos组件上传文件的代码
HttpServletRequestProxy uploadRequest = new HttpServletRequestProxy(request,observer);
        MultipartRequest multipart = new MultipartRequest(
                uploadRequest,
                webroot,
                sizeLimit,
                new DefaultFileRenamePolicy() 
            );

这样,在上传文件的时候,记录了服务器端获取文件的字节长度,根据上传文件的总长度,就可以计算出文件传输进度的百分比了
分享到:
评论
11 楼 RODDARK 2010-04-07  
楼主把代码帖吧,谢谢!
10 楼 Jack-chen 2010-01-30  
给个代码吧,,,,万分感谢!
9 楼 foxlish 2009-11-01  
现在计算进度速度之类都是在客户端计算的,,无需通过服务器。。

8 楼 kimmking 2009-08-13  
_咖啡杯垫 写道
willko 写道
现在计算进度速度之类都是在客户端计算的,,无需通过服务器。。

在客户端和在服务器计算是一样的


还得请教
1、客户端(浏览器端)如何直接计算进度?
2、服务器端有没有对上传的文件流进行监听并与客户端进行交互的API? 通过异步来处理的话也只能对正在写的文件进行处理吧。而且实现这个之前要知道文件的存储路径。

无非是flash或activex、Silverlight

js是没办法的
7 楼 _咖啡杯垫 2009-08-12  
willko 写道
现在计算进度速度之类都是在客户端计算的,,无需通过服务器。。

在客户端和在服务器计算是一样的


还得请教
1、客户端(浏览器端)如何直接计算进度?
2、服务器端有没有对上传的文件流进行监听并与客户端进行交互的API? 通过异步来处理的话也只能对正在写的文件进行处理吧。而且实现这个之前要知道文件的存储路径。
6 楼 willko 2009-06-13  
现在计算进度速度之类都是在客户端计算的,,无需通过服务器。。

在客户端和在服务器计算是一样的
5 楼 零下冰度 2009-06-12  
楼主给个完整的代码吧
4 楼 KimShen 2009-06-12  
So懒 写道
    今天登陆一个php论坛,发现上传附件时,显示了文件上传的进度条,记起自己以前也研究过在J2EE下上传文件显示进度条的问题,现在整理一下,希望对以后遇到这方面问题的人能够有所帮助。
    获取文件上传的进度主要有二个问题需要解决,一个是上传文件后向服务器获取当前文件传输进度的问题,另一个就是服务器如何计算当前文件的传输进度。
    第一个问题很好解决,通过异步请求不断的向服务器请求文件上传的进度直到文件上传完毕就可以了。主要是如何解决第二个问题。
    现在第三方文件上传的组件很多,如commons-fileupload和cos等,不管用哪一个组件,都是以http协议为基础的,而在Servlet当中,服务器接收的任何数据,都是使用ServletInputStream来读取的,第三方的文件上传组件也是一样的。那么我们可以做一个ServletInputStream的代理类,在读取方法中记录读取数据的字节数,需要注意要区分不同的用户来记录
public ServletInputStreamProxy(ServletInputStream in,
            UploadFileObserver observer) {
        this.in = in;
        this.observer = observer;
}
public int read(byte[] b, int off, int len) throws IOException {
        int r = in.read(b, off, len);
        if (r != -1) {
            observer.markUploadSize(r);
        }
        return r;
}

通过上面的代码,我们可以在文件上传的时候,通过代理的ServletInputStream来记录服务器端读取到的文件字节数,但只代理ServletInputStream还不行,因为ServletInputStream是由HttpServletRequest获取的,所以我们还需要代理HttpServletRequest,这里可以用动态代理或者代理HttpServletRequestWrapper,下面给出代理HttpServletRequestWrapper的代码
public class HttpServletRequestProxy extends HttpServletRequestWrapper {
    
    private UploadFileObserver observer;
    public HttpServletRequestProxy(HttpServletRequest request,UploadFileObserver observer) {
        super(request);
        this.observer = observer;
    }

    /* (non-Javadoc)
     * @see javax.servlet.ServletRequestWrapper#getInputStream()
     */
    public ServletInputStream getInputStream() throws IOException {
        ServletInputStream in = super.getInputStream();
        return new ServletInputStreamProxy(in,observer);
    }
}

之后我们在使用第三方组件上传文件的时候,需要用HttpServletRequestProxy代替HttpServletRequest
下面是使用cos组件上传文件的代码
HttpServletRequestProxy uploadRequest = new HttpServletRequestProxy(request,observer);
        MultipartRequest multipart = new MultipartRequest(
                uploadRequest,
                webroot,
                sizeLimit,
                new DefaultFileRenamePolicy() 
            );

这样,在上传文件的时候,记录了服务器端获取文件的字节长度,根据上传文件的总长度,就可以计算出文件传输进度的百分比了


一个是上传文件后向服务器获取当前文件传输进度的问题
另一个就是服务器如何计算当前文件的传输进度。

服务器怎么提供给你上传进度? 流在传输的时候有异步返回进度的API?

这样,在上传文件的时候,记录了服务器端获取文件的字节长度,根据上传文件的总长度,就可以计算出文件传输进度的百分比

还是这个问题,等你计算了文件大小说明文件都已经进入流了 也就是说上传完毕了.得到大小还有意义吗?

希望你把代码完整的贴出来而不是贴些乱七八糟的东西


3 楼 Blithe 2009-06-12  
markUploadSize这方法在哪呢
2 楼 朗拿颠老 2009-06-12  
给个完整的例子啊..谢谢
1 楼 taupo 2009-06-12  
把代码贴全啊。。。。。。。

相关推荐

    java实现大文件上传并有进度条及其代码解析

    在Java开发中,处理大文件上传是一项常见的任务,特别是在Web应用中。为了提供更好的用户体验,通常需要添加进度条功能,让用户了解文件上传的状态。本文将详细介绍如何使用Java实现大文件的上传并展示进度条,同时...

    java 文件上传支持多文件进度条预览删除

    总的来说,这个项目涵盖了Web开发中多个重要环节,包括前后端交互、文件处理、用户界面反馈和安全性控制。实现这样的功能需要对Java Web、JSP、jQuery以及HTML5有深入理解,并且需要注意文件操作的安全性和用户体验...

    带进度条的文件上传下载组件(JAVA)

    在这个组件中,Java被用来编写服务器端的逻辑,处理文件的上传和下载请求,以及进度条状态的更新。 2. **JSP(JavaServer Pages)**:JSP是Java Web开发中的一个重要组成部分,它允许开发者在HTML页面中嵌入Java...

    java web 文件上传进度条源码

    在Java Web开发中,文件上传是一项常见的功能,而为用户提供实时的上传进度条可以显著提升用户体验。本项目提供的"java web 文件上传进度条源码"着重解决了这一需求,包括已用时间、剩余时间、上传速度以及进度条的...

    Java 文件上传带进度条源码

    总之,"Java 文件上传带进度条源码"是一个结合了Java Web开发、多线程、异步处理和前端交互的实例,对于理解和实践Java文件上传功能具有很高的参考价值。通过学习这个示例,开发者可以更好地掌握如何在实际项目中...

    java做的一个带进度条的文件上传小项目

    在Java编程领域,文件上传是一项常见的任务,尤其在开发Web应用程序时。本项目是一个使用Java实现的带有进度条和取消功能的文件上传示例,它利用了Apache的Commons FileUpload库来处理文件上传的过程。Commons ...

    JAVA实现模拟导入数据/上传文件进度条

    在Java Web开发中,实现一个模拟数据导入或文件上传进度条功能可以极大提升用户体验,让用户在等待过程中心中有数。这个功能通常涉及到前端与后端的交互,涉及到的技术包括Servlet、JSP、jQuery和Ajax。下面我们将...

    Extjs+java+swf多文件上传进度条显示项目

    标题中的“Extjs+java+swf多文件上传进度条显示项目”是一个综合性的Web开发实践,涉及到前端的用户界面、后端的数据处理以及文件上传过程中进度反馈的实现。这个项目利用了Extjs库来构建用户界面,Java作为服务器端...

    java实现带进度条的文件上传

    8. **前端技术进步**:随着技术的发展,现代浏览器已经支持HTML5的File API,可以直接在HTML页面中实现文件上传和进度条,不再需要依赖Flash插件。然而,对于旧版浏览器的兼容性,swfupload仍是一个可行的选择。 综...

    extjs java 上传文件进度条

    当我们将两者结合,特别是在文件上传场景下,我们就可以实现一个动态的、用户友好的上传文件进度条。 标题"extjs java 上传文件进度条"所涉及的知识点主要涵盖以下几个方面: 1. **ExtJS组件库**:ExtJS的核心在于...

    swfupload多文件上传带进度条实例

    总结,SWFUpload 实例提供了在不支持HTML5的浏览器中实现多文件上传带进度条的功能,通过结合Flash和JavaScript技术,实现了良好的用户交互。通过VS2012和.NET Framework 4.0,我们可以方便地构建服务器端的处理逻辑...

    JAVA WEB在线上传无刷新进度条显示

    在Java Web开发中,实现在线文件上传并展示无刷新进度条是一项常见的需求,它能显著提升用户体验。这一技术主要依赖于AJAX(异步JavaScript和XML)和Web服务器端的技术支持,如Servlet、Spring MVC或者Struts等。...

    java ajax上传文件并显示进度条

    在现代Web应用中,用户对交互性和实时反馈的需求日益增强,这就催生了“java ajax上传文件并显示进度条”的技术。Ajax(Asynchronous JavaScript and XML)是一种创建动态网页的技术,它允许页面在不重新加载整个...

    struts2+ajax文件进度条的实现

    总的来说,"struts2+ajax文件进度条的实现"是一个典型的前后端协同工作的示例,它展示了如何在Java web应用中优化用户体验,特别是在处理大文件上传时。通过理解Ajax的工作原理、Struts2的文件上传机制以及前端组件...

    java上传(带进度条)

    在Java编程中,实现文件上传并提供进度条功能是一项常见的需求,特别是在开发Web应用或桌面应用时。这里我们将深入探讨如何以`.flv`(Flash Video)格式为例,利用IO流进行文件上传,并同时实现进度条的显示。 首先...

    WEB超大文件带进度条上传

    在Web开发中,上传大文件是一项常见的需求,但传统的HTTP协议并不支持断点续传,因此在处理G级别这样的超大文件时,需要采用特殊的技术手段。本话题将围绕"WEB超大文件带进度条上传"这个主题,详细介绍Java如何实现...

    JSP文件上传 支持进度条显示.rar

    这个项目展示了如何在JSP环境中利用AJAX技术实现高效、用户体验良好的文件上传功能,对于学习JSP和Web开发的开发者来说,是一个很好的实践案例。通过研究这个项目,可以深入理解文件上传的原理,以及如何在实际应用...

    利用DWR实现文件上传进度条

    在Web开发中,文件上传是常见的功能,但如何实时显示文件上传进度给用户带来更好的交互体验呢?本文将详细介绍如何利用Direct Web Remoting (DWR)来实现这一功能。DWR是一种Java库,它允许JavaScript和服务器端Java...

    Java中使用Ajax、Jquery带进度条文件上传.

    在Java web开发中,实现一个带有进度条的文件上传功能是一项常见的需求,它能提供用户友好的交互体验。本文将详细讲解如何结合Ajax、jQuery和Java来实现这一功能。 首先,我们需要理解Ajax(Asynchronous ...

    JSP文件上传进度条

    在Web开发中,用户在上传大文件时常常需要等待较长的时间,这期间如果没有反馈,用户体验会大大降低。因此,引入“JSP文件上传进度条”技术可以显著改善这种情况,为用户提供实时的上传进度,增强交互体验。这个技术...

Global site tag (gtag.js) - Google Analytics