日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2025/3/12 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 }

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的java 上传 进度,关于 javaweb的文件上传实时显示进度的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。