利用jsp+Extjs实现动态显示文件上传进度

利用jsp+Extjs实现动态显示文件上传进度的完整攻略主要有以下几步:

1、前端页面

前端页面需要使用Extjs实现。首先需要在页面中引入相应的js文件,例如:

<script src="ext-all.js"></script>
<script src="ext-lang-zh_CN.js"></script>

然后需要在页面中添加相应的组件,例如:

var progressBar = new Ext.ProgressBar({
    width: 300,
    text: '上传进度',
    renderTo: Ext.getBody()
});

var uploadForm = new Ext.form.FormPanel({
    url: 'upload.jsp',
    fileUpload: true,
    frame: true,
    title: '上传文件',
    labelWidth: 50,
    items: [{
        xtype: 'filefield',
        anchor: '100%',
        fieldLabel: '选择文件',
        name: 'upload'
    }]
});

uploadForm.addButton('上传', function(){
    if(uploadForm.getForm().isValid()){
        progressBar.wait({
            interval: 200,
            text: '上传中,请稍候',
            scope: this
        });

        uploadForm.getForm().submit({
            success: function(form, action){
                progressBar.reset();
                Ext.MessageBox.alert('提示', action.result.msg);
            },
            failure: function(form, action){
                progressBar.reset();
                Ext.MessageBox.alert('提示', action.result.msg);
            }
        });
    }
})

uploadForm.render('form');

在上面的代码段中,我们使用了Ext.ProgressBar组件来显示上传进度,使用了Ext.form.FormPanel组件来实现文件上传的表单,同时添加了一个“上传”按钮,并在点击按钮后调用submit方法来提交表单。

2、服务端处理

服务端处理部分需要使用jsp来实现。首先需要在jsp页面中开启流,使用response对象获取OutputStream,将文件内容通过字节流的方式写到客户端。同时,需要在OutputStream的flush()方法中将上传进度通过response的writer对象返回给客户端。示例代码如下:

<%@ page contentType="text/html; charset=utf-8" %>

<%
    String savePath = getServletContext().getRealPath("/") + "upload";
    File uploadDir = new File(savePath);

    if(!uploadDir.exists()){
        uploadDir.mkdir();
    }

    String fileName = "";
    InputStream input = null;
    FileOutputStream fos = null;
    OutputStream output = null;

    try{
        FileItemFactory factory = new DiskFileItemFactory();
        ServletFileUpload upload = new ServletFileUpload(factory);
        List<FileItem> items = upload.parseRequest(request);

        for(FileItem item : items){
            if(!item.isFormField()){
                fileName = item.getName();
                input = item.getInputStream();
                fos = new FileOutputStream(savePath + "/" + fileName);

                byte[] buffer = new byte[1024];
                int len = -1;
                long fileSize = 0;

                while((len = input.read(buffer)) != -1){
                    fos.write(buffer, 0, len);
                    fileSize += len;
                    double progress = (double)fileSize / item.getSize();

                    response.setContentType("text/html;charset=UTF-8");
                    response.getWriter().write("{\"progress\":" + progress + "}");
                    response.getWriter().flush();
                }
            }
        }

        out.println("{\"success\":true,\"msg\":\"文件上传成功\"}");
    }catch(Exception e){
        out.println("{\"success\":false,\"msg\":\"文件上传失败\"}");
    }finally{
        try{
            fos.close();
            input.close();
        }catch(Exception e){

        }
    }
%>

在上面的代码段中,我们使用了response的writer对象来实现动态显示上传进度。通过计算当前上传大小与文件总大小的比例来计算上传进度并通过writer对象返回给客户端。

示例说明

示例一:使用jsp+Extjs实现文件上传

  1. 首先,在项目的根目录下创建一个名为“upload.jsp”的文件。

  2. 在“upload.jsp”文件中添加以下代码:

<%@ page contentType="text/html; charset=UTF-8" %>

<!DOCTYPE html>
<html>
<head>
    <title>上传文件</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <link rel="stylesheet" type="text/css" href="ext-all.css" />
    <script src="ext-all.js"></script>
    <script src="ext-lang-zh_CN.js"></script>
    <script type="text/javascript">
        Ext.onReady(function(){
            var progressBar = new Ext.ProgressBar({
                width: 300,
                text: '上传进度',
                renderTo: Ext.getBody()
            });

            var uploadForm = new Ext.form.FormPanel({
                url: 'upload.jsp',
                fileUpload: true,
                frame: true,
                title: '上传文件',
                labelWidth: 50,
                items: [{
                    xtype: 'filefield',
                    anchor: '100%',
                    fieldLabel: '选择文件',
                    name: 'upload'
                }]
            });

            uploadForm.addButton('上传', function(){
                if(uploadForm.getForm().isValid()){
                    progressBar.wait({
                        interval: 200,
                        text: '上传中,请稍候',
                        scope: this
                    });

                    uploadForm.getForm().submit({
                        success: function(form, action){
                            progressBar.reset();
                            Ext.MessageBox.alert('提示', action.result.msg);
                        },
                        failure: function(form, action){
                            progressBar.reset();
                            Ext.MessageBox.alert('提示', action.result.msg);
                        }
                    });
                }
            })

            uploadForm.render('form');
        });
    </script>
</head>
<body>
    <div id="form"></div>
</body>
</html>
  1. 然后,在项目的根目录下创建一个名为“upload”的文件夹,用于存放上传的文件。

  2. 最后,将Extjs的相关文件(ext-all.js和ext-all.css)复制到项目根目录下,并启动Tomcat服务器,在浏览器中访问“http://localhost:8080/upload.jsp”页面即可上传文件。

示例二:使用jsp+Extjs实现动态进度条显示

  1. 首先,在“upload.jsp”文件中添加以下代码:
<%
    String savePath = getServletContext().getRealPath("/") + "upload";
    File uploadDir = new File(savePath);

    if(!uploadDir.exists()){
        uploadDir.mkdir();
    }

    String fileName = "";
    InputStream input = null;
    FileOutputStream fos = null;
    OutputStream output = null;

    try{
        FileItemFactory factory = new DiskFileItemFactory();
        ServletFileUpload upload = new ServletFileUpload(factory);
        List<FileItem> items = upload.parseRequest(request);

        for(FileItem item : items){
            if(!item.isFormField()){
                fileName = item.getName();
                input = item.getInputStream();
                fos = new FileOutputStream(savePath + "/" + fileName);

                byte[] buffer = new byte[1024];
                int len = -1;
                long fileSize = 0;

                while((len = input.read(buffer)) != -1){
                    fos.write(buffer, 0, len);
                    fileSize += len;
                    double progress = (double)fileSize / item.getSize();

                    response.setContentType("text/html;charset=UTF-8");
                    response.getWriter().write("{\"progress\":" + progress + "}");
                    response.getWriter().flush();
                }
            }
        }

        out.println("{\"success\":true,\"msg\":\"文件上传成功\"}");
    }catch(Exception e){
        out.println("{\"success\":false,\"msg\":\"文件上传失败\"}");
    }finally{
        try{
            fos.close();
            input.close();
        }catch(Exception e){

        }
    }
%>
  1. 然后,在“upload.jsp”页面中添加以下代码:
<script type="text/javascript">
    Ext.onReady(function(){
        var progressBar = new Ext.ProgressBar({
            width: 300,
            text: '上传进度',
            renderTo: Ext.getBody()
        });

        var uploadForm = new Ext.form.FormPanel({
            url: 'upload.jsp',
            fileUpload: true,
            frame: true,
            title: '上传文件',
            labelWidth: 50,
            items: [{
                xtype: 'filefield',
                anchor: '100%',
                fieldLabel: '选择文件',
                name: 'upload'
            }]
        });

        uploadForm.addButton('上传', function(){
            if(uploadForm.getForm().isValid()){
                progressBar.wait({
                    interval: 200,
                    text: '上传中,请稍候',
                    scope: this
                });

                uploadForm.getForm().submit({
                    success: function(form, action){
                        progressBar.reset();
                        Ext.MessageBox.alert('提示', action.result.msg);
                    },
                    failure: function(form, action){
                        progressBar.reset();
                        Ext.MessageBox.alert('提示', action.result.msg);
                    }
                });
            }
        })

        uploadForm.render('form');

        var updateProgress = function(){
            Ext.Ajax.request({
                url: 'upload.jsp',
                success: function(response, options){
                    var result = Ext.decode(response.responseText);

                    if(result.success){
                        progressBar.updateProgress(result.progress);
                        setTimeout(updateProgress, 1000);
                    }
                },
                failure: function(response, options){

                }
            });
        }

        setTimeout(updateProgress, 1000);
    });
</script>

在上面的代码段中,我们使用了Ext.Ajax.request方法来定时向服务端发送请求,获取当前上传进度,并使用Ext.ProgressBar组件来动态显示上传进度。

  1. 最后,启动Tomcat服务器,在浏览器中访问“http://localhost:8080/upload.jsp”页面即可上传文件,并动态显示上传进度。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:利用jsp+Extjs实现动态显示文件上传进度 - Python技术站

(0)
上一篇 2023年6月15日
下一篇 2023年6月15日

相关文章

  • java文件的简单读写操作方法实例分析

    Java文件的简单读写操作方法实例分析 在 Java 程序开发中,我们经常需要对文件进行读写操作。本篇攻略将详细介绍 Java 文件读写的方法以及相关注意事项。 文件读取操作 在 Java 中,我们可以使用 FileInputStream 和 BufferedInputStream 类来读取文件。 FileInputStream import java.io…

    Java 2023年5月20日
    00
  • GoLang与Java各自生成grpc代码流程介绍

    GoLang与Java都支持gRPC服务的生成,下面将详细介绍它们各自生成gRPC代码的流程: GoLang生成gRPC代码的流程 1.准备proto文件 准备好proto文件,它定义了gRPC服务所需要的消息结构和服务接口。 syntax = "proto3"; package greeter; message HelloRequest…

    Java 2023年5月26日
    00
  • java实现列表、集合与数组之间转化的方法

    关于Java实现列表、集合与数组间的转化,我们可以采用Java API中提供的相关类库来实现。Java程序员常用的类库主要为java.util包下的ArrayList、LinkedList、HashSet、TreeSet、HashMap、TreeMap等。 下面,我将详细讲解Java实现列表、集合与数组间的转化的方法。 列表转化为数组 ArrayList -…

    Java 2023年5月26日
    00
  • FLASH 脚本代码大全

    FLASH 脚本代码大全 – 完整攻略 什么是 FLASH 脚本代码大全? FLASH 脚本代码大全是一本介绍 Adobe Flash 中 ActionScript 脚本编程语言常用代码的书籍,其中包含了许多实用的代码示例。对于 Flash 开发人员,这本书是十分重要的参考资料。 学习 FLASH 脚本代码大全的方法 1.按类别阅读代码示例 为了更好的理解示…

    Java 2023年6月15日
    00
  • Java开发人员最常犯的5个错误总结

    Java开发人员最常犯的5个错误总结 作为Java开发人员,我们都有可能在代码编写和项目开发中犯一些错误。本文将总结Java开发人员最常犯的5个错误,并提供解决方案。 1. 空指针异常(NullPointerException) 空指针异常是Java开发中最常见的运行时异常之一。它通常在未检查null引用的情况下发生。 解决方案: 检查所有可能出现null引…

    Java 2023年5月27日
    00
  • Java超详细分析抽象类和接口的使用

    Java超详细分析抽象类和接口的使用 什么是抽象类? 抽象类是一个不能被实例化的类,它的作用是为子类提供一组公共的方法或属性,而不实现它们的具体实现。因为抽象类无法被实例化,所以只有它的子类可以被实例化。抽象类是通过使用 abstract 关键字定义的。 抽象类的定义 抽象类定义的方式是通过使用 abstract 关键字: public abstract c…

    Java 2023年5月26日
    00
  • spring中使用mybatis plus连接sqlserver的方法实现

    本文将为大家讲解在Spring中使用Mybatis Plus连接SQL Server的方法,并且附带两个示例实现,以下是具体步骤: 步骤一:添加pom依赖 在pom.xml文件中添加Mybatis Plus和SQL Server的依赖: <dependencies> <dependency> <groupId>com.ba…

    Java 2023年6月16日
    00
  • Android中断并重启一个Thread线程的简单方法

    如何在Android中断并重启一个Thread线程呢?以下提供两种方法: 方法一:使用interrupt()方法 在Thread线程中调用interrupt()方法可以中断正在执行的线程。以下是具体步骤: 在Thread的run()方法中添加循环。例如,循环执行某个任务: public void run() { while (!Thread.currentT…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部