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的文件上传实时显示进度的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: gis根据行政区计算栅格数据计算_亚马逊
- 下一篇: php_os用法,golang中os包用