java 上传 进度,关于 javaweb的文件上传实时显示进度

方法:使用单例保存实时信息。具体的实现方法就是,当用户点击了处理按钮时,在后台开启一个线程进行处理,并且每进行到一步,就向单例中写入当前状态信息。然后编写一个servlet,用于返回单例中的信息,前台循环发送请求,这样就能实现实时显示进度的效果。、

1,建立一个单例保存信息

2.上传servlet

3.进度 servlet

1.1以下为前端代码

标题

文件上传DEMO

以下为前端显示部分

文件上传:

登录:

以下为具体实施过程 主要是ajax导入相关的jquery包

20    

21    (function () {

22        var form = document.getElementById("dataForm");

23        var progress = document.getElementById("progress");

24

25        $("#submit").click(function(event) {

26             //阻止默认事件

27             event.preventDefault();

28             //循环查看状态

setInterval() 方法可按照指定的周期(以毫秒计)来调用函数或计算表达式。一每次--**秒的时间进行循环

29             var t = setInterval(function(){

30                 $.ajax({

31                     url: 'ProgressServlet',

32                     type: 'POST',

33                     dataType: 'text',

34                     data: {

35                        filename:fileInput.files[0].name,

36                     },

37                     success: function(responseText) {

38                         var data =JSON.parse(responseText);

39                         //前台更新进度

40                         progress.innerText =parseInt((data.progress / data.size) * 100);

41                     },

42                     error: function(){

43                        console.log("error");

44                     }

45                 });

46             }, 时间);

47             //上传文件

48             $.ajax({

49                 url: 'UploadServlet',

50                 type: 'POST',

51                 dataType: 'text',

52                 data: new FormData(form),

53                 processData: false,

54                contentType: false,

55                 success: function(responseText) {

56                     //上传完成,清除循环事件. clearInterval是关闭setInterval设置的时间

57                     clearInterval(t);

58                     //将进度更新至100%

59                     progress.innerText = 100;

60                 },

61                 error: function(){

62                    console.log("error");

63                 }

64             });

65             return false;

66        });

67    })();

68    

2.1一个类实现单例进行存储

import java.util.Hashtable;

3 publicclass ProgressSingleton {

4     //为了防止多用户并发,使用线程安全的Hashtable

5     private static Hashtable table = new Hashtable<>();

6

7     public static void put(Object key, Objectvalue){

8         table.put(key, value);

9     }

10

11    public static Object get(Object key){

12        return table.get(key);

13     }

14

15    public static Object remove(Object key){

16        return table.remove(key);

17     }

18 }

3.1上传类

@WebServlet("/UploadServlet")

22 public class UploadServlet extendsHttpServlet {

23    private static final long serialVersionUID = 1L;

24

25    public UploadServlet() {

26    }

27

28    protected void doGet(HttpServletRequest request, HttpServletResponseresponse) throws ServletException, IOException {

29        DiskFileItemFactory接口是进行存储上传文件,当文件较小是直接存储在内存中,但是jvm是有限的,因此如果文件比较大时,存在缓存盘里面DiskFileItemFactory是创建FileItem对象的工厂包括方法:

30        DiskFileItemFactory factory = new DiskFileItemFactory();

setSizeThreshold方法用于设置是否将上传文件已临时文件的形式保存在磁盘的临界值(以字节为单位的int值),如果从没有调用该方法设置此临界值,将会采用系统默认值10KB。对应的getSizeThreshold() 方法用来获取此临界值。

31        factory.setSizeThreshold(4*1024);

32 ServletFileUpload   负责处理上传的文件数据,并将表单中每个输入项封装成

一个FileItem对象中.

33        ServletFileUpload upload = new ServletFileUpload(factory);

34        DiskFileItem类是它的实现FileItem

35        List fileItems;文件下载

36        try {

parseRequest 解析出http中表单的数据 然后将他们分别包装成FileItem对象,然后将这些存到集合里返回

37             fileItems = upload.parseRequest(newServletRequestContext(request));

38             //获取文件域

39             FileItem fileItem =fileItems.get(0);有问题

40             //使用sessionid+ 文件名生成文件号

41             String id =request.getSession().getId() + fileItem.getName();

42             //向单例哈希表写入文件长度和初始进度

43             ProgressSingleton.put(id +"Size", fileItem.getSize());

44             //文件进度长度

45             long progress = 0;

46             //用流的方式读取文件,以便可以实时的获取进度

47             InputStream in =fileItem.getInputStream();

48             File file = newFile("D:/test");

49             file.createNewFile();

50             FileOutputStream out = newFileOutputStream(file);

51             byte[] buffer = new byte[1024];

52             int readNumber = 0;

53             while((readNumber =in.read(buffer)) != -1){

54                 //每读取一次,更新一次进度大小

55                 progress = progress +readNumber;

56                 //向单例哈希表写入进度

57                 ProgressSingleton.put(id +"Progress", progress);

58                 out.write(buffer);

59             }

60             //当文件上传完成之后,从单例中移除此次上传的状态信息

61             ProgressSingleton.remove(id +"Size");

62             ProgressSingleton.remove(id +"Progress");

63             in.close();

64             out.close();

65        } catch (FileUploadException e) {

66             e.printStackTrace();

67        }

68

69        response.getWriter().print("done");

70    }

71

72    protected void doPost(HttpServletRequest request, HttpServletResponseresponse) throws ServletException, IOException {

73        doGet(request, response);

74    }

75

76 }

4.1进度类(servlet)

@WebServlet("/ProgressServlet")

13 public class ProgressServlet extendsHttpServlet {

14    private static final long serialVersionUID = 1L;

15

16    public ProgressServlet() {

17        super();

18        // TODO Auto-generated constructor stub

19    }

20

21    protected void doGet(HttpServletRequest request, HttpServletResponseresponse) throws ServletException, IOException {

22

23        String id = request.getSession().getId();

24        String filename = request.getParameter("filename");

25        //使用sessionid + 文件名生成文件号,与上传的文件保持一致

26        id = id + filename;

27        Object size = ProgressSingleton.get(id + "Size");

28        size = size == null ? 100 : size;

29        Object progress = ProgressSingleton.get(id + "Progress");

30        progress = progress == null ? 0 : progress;

31        JSONObject json = new JSONObject();

32        json.put("size", size);

33        json.put("progress", progress);

34        response.getWriter().print(json.toString());

35    }

36

37    protected void doPost(HttpServletRequest request, HttpServletResponseresponse) throws ServletException, IOException {

38        doGet(request, response);

39    }

40

41 }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/563607.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 解压到内存,Java GZip 基于内存实现压缩和解压的方法

欢迎大家关注本博&#xff0c;同时欢迎大家评论交流&#xff0c;可以给个赞哦&#xff01;&#xff01;&#xff01;GZip是常用的无损压缩算法实现&#xff0c;在Linux中较为常见&#xff0c;像我们在Linux安装软件时&#xff0c;基本都是.tar.gz格式。.tar.gz格式文件需要先对…

php开发添加表情功能,WordPress网站评论区如何实现添加表情包功能?

做网站过程中&#xff0c;可以给自己的网站添加评论框&#xff0c;供用户评论。默认情况下&#xff0c;Wordpress网站评论框是没有添加表情功能的&#xff0c;那么WordPress网站评论区如何实现添加表情包功能&#xff1f;今天我们介绍一下如何给自己的Wordpress网站评论框添加表…

php htmlspecialchars 不管用,php5.4以上版本GBK编码下htmlspecialchars输出为空问题解决方法汇总_php技巧...

从旧版升级到php5.4&#xff0c;恐怕最麻烦的就是htmlspecialchars这个问题了&#xff01;当然&#xff0c;htmlentities也会受影响&#xff0c;不过&#xff0c;对于中文站来说一般用htmlspecialchars比较常见&#xff0c;htmlentities非常少用到。可能老外认为网页普遍应该是…

matlab 微秒 符号,matlab处理csi

使用python调用matlab API接口进行数据分析找到matlab安装目录下自带的setup.py的路径我的路径如下D:\MATLAB\R2018a\extern\engines\python打开cmd进入到刚才找到的路径管理员权限执行&#xff01;&#xff01;&#xff01; pyhton setup.py install具体代码1.将csiTool中的ma…

日冕物质抛射检测matlab,日冕图像论文,关于基于实时数据的日冕物质抛射自动检测方法相关参考文献资料-免费论文范文...

导读:本论文主要论述了日冕图像论文范文相关的参考文献,对您的论文写作有参考作用。(昆明理工大学信息与自动化学院,昆明 650504)(Faculty of Information Engineering and Automation,Kunming University of Science and Technology,Kunming 650504,China)摘 要&#xff1a;本…

link url下载php,php脚本生成google play url的下载链接,下载apk并自动反编译后获取android版本号...

php脚本生成google play url的下载链接&#xff0c;下载apk并自动反编译后获取android版本号需求:get the offer tracking linkfollow the redirect to get google play urlGo to http://apps.evozi.com/apk-downloader/Enter google play urlDownload APK fileDecompile APK f…

java中.of,java中instanceof的用法

java 中的instanceof 是一个二元操作符(运算符)运算符&#xff0c;由于是字母组成&#xff0c;所以是Java的保留关键字&#xff0c;它的作用是用来判断&#xff0c;instanceof 左边对象是否为instanceof 右边类的实例&#xff0c;返回一个boolean类型值。还可以用来判断子父类的…

java实现鸭子类型,Golang的interface及duck typing鸭子类型

Golang的interface及duck typing鸭子类型“当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子&#xff0c;那么这只鸟就可以被称为鸭子。” 意思就是: 一个东西究竟是不是鸭子&#xff0c;取决于它能不能满足鸭子的工作。duck typing 多见于动态语言,例如PHP,Python等…

小猴吃桃matlab,看图写话:小猴吃桃精彩选篇

看图写话&#xff1a;小猴吃桃精彩选篇两只聪明的小猴子一天上午&#xff0c;风和日丽。佳佳和皮皮到小溪边玩耍&#xff0c;忽然皮皮开心的大叫&#xff1a;“快看那边有好多又大又红的桃子&#xff01;”这时佳佳也高兴的欢呼着&#xff0c;馋的它们开水直流。皮皮和佳佳都在…

php mysql 分行执行,php执行mysql存储及执行脚本

php执行mysql存储及执行脚本php页面执行mysql存储过程:# vi cunchu.php$db new mysqli("localhost","root","123456","team1");$result$db->query("CALL challenge_crontab()");?>:wq注释&#xff1a;执行team1数据…

oracle 换字段顺序,修改ORACLE的字段顺序

首先你要有一个pl/sql&#xff0c;其实没有也行&#xff0c;但是这数据库还是有一个可视化界面为好啊。1.首先&#xff0c;以sys用户的身份登录PL/SQL2.查询出你要更改的表的ID&#xff0c;以我本地的数据为例&#xff0c;我要改‘FINACE‘用户下‘INCOME‘这张表。注&#xff…

oracle单行子查询返回多个行 order by,单行子查询返回多个行 Issue分析求助

with order_base as --获取订单基础情况(select ou.order_key order_key, ou.order_quantity_i, ood.dispatch_time_t, ou.part_number_s, I032ZZ01 pline_name_sfrom order_uv ou left join at_as_om_orderdispatchstatus ood on ou.order_key ood.order_54union allselect m…

php按照名称搜索,PHP从类型和名称搜索

很抱歉,标题不好,但我不知道有更好的选择.目前,我正在创建一个搜索引擎以获取产品详细信息.我有2种搜索类型,第一种是使用产品类型进行搜索,另一种是使用产品名称进行搜索.这是搜索代码&#xff1a;$search_exploded explode (" ", $search);$x "";$cons…

srvctl 在oracle下运行,在RAC 中解决 vipca 和 srvctl 无法执行的错误

问题一: vip创建问题/home/oracle/crs/oracle/product/10/crs/jdk/jre//bin/java: error while loading shared libraries: libpthread.so.0: cannot open shared object file解决方法&#xff1a;这个错误一般是在 5上装 时会碰到的&#xff0c;当界面提示你用root脚本执行相应…

简述oracle数据库特殊状态,【OracleDB】 01 概述和基本操作

实例概念&#xff1a;Oracle有一个特殊的概念Oracle数据库 数据库 Oracle文件系统 Oracle实例实例处理Oracle的请求&#xff0c;调用文件系统然后返回结果响应给客户端单实例和多实例一个数据库可以对应多个实例操作数据库服务这是Oracle数据库的服务&#xff0c;一定要安装…

oracle会闪,oracle闪来

当前位置:我的异常网 数据库 oracle闪来oracle闪来www.myexceptions.net 网友分享于&#xff1a;2013-09-10 浏览&#xff1a;1次oracle闪回闲来无事&#xff0c;把以前的笔记整理一下放到这里。默认情况下&#xff0c;oracle10g可以直接闪回表&#xff0c;闪回表数据&#…

oracle导出有分区表的用户,分区表导出导入

--创建分区表create table t2(id int,name varchar2(10))partition by range(id)(partition p1 values less than(10),partition p2 values less than(20),partition p3 values less than(30),partition p4 values less than(40),partition p5 values less than(50))--插入数据…

php分流短信服务商,使用第三方短信服务商云片发送短信(php样例)

//智能匹配模版接口发送样例$apikey "---------------------------"; //请用自己的apikey代替$mobile "--------------"; //请用自己的手机号代替$text"【云片网】亲爱的doubiyuzai&#xff0c;您的验证码是------。有效期为100000000小时&#xff…

oracle中affirm,2.Oracle Data Guard 参数介绍

Oracle Data Guard 参数介绍Data Guard作为Oracle提供的一个高可用及灾备解决方案,理解并可以实施它对于DBA来说是非常重要套的技能上节介绍了有关Data Guard的概念&#xff0c;这节将介绍相关的一些参数有的参数是做为备库角色时才生效的&#xff0c;会单独说出来1. DB_NAME该…

linux lib目录找不到,linux中jpeglib库文件我安装了,但是我运行自己写的代码总是找不到这个库...

首先&#xff0c;找到你的VC6.0的安装路径(就是你安装到哪里了&#xff0c;不是你安装包setup.exe的路径)&#xff0c;假设按照默认路径安装的话&#xff0c;头文件和库文件的路径应该是这样子的&#xff1a;include files:C:\Program Files\Microsoft Visual Studio\VC98\INCL…