1. 程式人生 > >spring mvc檔案上傳實現進度條

spring mvc檔案上傳實現進度條

    檔案上傳應該大部分人都接觸過,一般都是基於commons-fileupload元件來實現,SpringMVC的檔案上傳功能也是在commons-fileupload元件提供的功能上面做了一些包裝功能,使檔案上傳開發更容易方便。

     看下上傳效果圖:

                              

   專案執行效果:

     

    專案使用spring mvc+mybatis實現,資料庫採用mysql,具體參考README就可以釋出起來。

一、實現普通檔案上傳

        我們知道,類DispatcherServlet是SpringMVC的入口,在其doDispatch方法裡面,我們可以看到它會先去檢查有沒配置multipartResolver



        如果有的話會先執行它的resolveMultipart方法:

        因此,我們在配置檔案中新增:
                則可使用SpringMVC自帶的CommonsMultipartResolver實現多個檔案上傳的功能。

二、實現進度條
        現在實現帶進度條的檔案上傳一般都是在客戶端用flash上傳元件計算,或者是通過客戶端外掛的方式。前者上傳元件有大小的限制,後者對於我們系統來說實現過於複雜,開發難度稍大。因此我們採用伺服器端計算檔案上傳進度,客戶端輪詢的方式。

Commons-fileupload元件自帶了檔案上傳進度的監聽器,類FileUploadBase提供了它的set方法。

ProgressListener是一個介面,我們需要自己實現它的update方法,引數pBytesRead表示已經上傳到伺服器的位元組數,pContentLength表示所有檔案的總大小,pItems表示第幾個檔案:

  SpringMVC沒有實現監聽器,所以如果要監聽的話得自己擴充套件CommonsMultipartResolver類,在newFileUpload裡面加入程式碼設定自己實現的監聽器:

        ServletFileUploadExt是對ServletFileUpload類進行的擴充套件,後面會提到。這樣在檔案上傳的過程中,監聽器將得到通知已上傳的位元組數:


自己實現的,在這個類中需要在每一次上傳請求中設定處理上傳進度的監聽器,並處理檔案上傳。

?
1 2 3 4 5 6 7 8 9 10 11 12 protected FileUpload newFileUpload(FileItemFactory fileItemFactory) {   ServletFileUpload upload = new ServletFileUpload(fileItemFactory);   upload.setSizeMax(-1);   if (request != null) {   HttpSession session = request.getSession(); //注意:這裡的listener不能公用,即不能放到方法外面 FileUploadProgressListener progressListener =  new FileUploadProgressListener(session); upload.setProgressListener(progressListener);   }   return upload;   }

在配置檔案spring-mvc-context.xml中配置使用自定義的Resolver。

?
1 2 3 4 <bean id="multipartResolver"   class="com.sunshine.fusys.controllers.CustomMultipartResolver"> <property name="defaultEncoding" value="UTF-8" /> <property name="maxUploadSize" value="1000000000000" /> </bean>

最終在上傳時,會通過commons-fileupload的元件進行上傳時,會把上傳進度讀取到設定的session中,最後通過一個controller訪問這個設定的進度值,就可以獲取了。獲取進度的controller為ProgressController。客戶端採用非同步的方式獲取進度資訊進行展示,具體參考原始碼index-userFile.jsp

 三、取消檔案上傳
        取消檔案上傳實現方式為上傳時儲存上傳輸入流的引用,取消時關閉流,讓輸入流產生IO異常或者陣列越界異常,同時捕獲這些異常,則可取消檔案上傳。

最後補一個配置,spring mvc的專案訪問時預設訪問某個指定頁面或者controller的配置如下:

?
1 2 //轉向controller <mvc:view-controller path="/"  view-name="redirect:/indexMain/index" />

或者

?
1 2 //轉向index.jsp <mvc:view-controller path="/"  view-name="/index" />

相關推薦

spring mvc檔案實現進度

    檔案上傳應該大部分人都接觸過,一般都是基於commons-fileupload元件來實現,SpringMVC的檔案上傳功能也是在commons-fileupload元件提供的功能上面做了一些包裝功能,使檔案上傳開發更容易方便。      看下上傳效果圖:  

jQuery監聽檔案實現進度效果

給XMLHttpRequest物件的upload屬性繫結onprogress方法監聽上傳過程 var xhr=new XMLHttpRequest(); xhr.upload.onprogress=function(e){} 因為jQuery預設使用的

基於AJAX的檔案顯示進度實現

      基於Ajax的檔案上傳要實現的功能要求,要在使用者提交了上傳按鈕請求後,客戶端其頁面要顯示檔案上傳進度條。       其整個功能時序圖如圖所示。       簡單的說,要實現在客戶端顯示進度條,需要做的是:當客戶端提交上傳檔案請求後,伺服器在上傳檔案

使用jquery.form.js實現檔案進度前端程式碼

1、背景 ajax的表單提交只能提交data資料到後臺,沒法實現file檔案的上傳還有展示進度功能,這裡用到form.js的外掛來實現,搭配css樣式簡單易上手,而且高大上,推薦使用。 2、靜態頁搭建 html程式碼如下 <div clas

spring MVC檔案和實時進度提醒

@RequestMapping(value = "/getProgress.do", method = RequestMethod.POST, produces = { "application/json" }) @ResponseBody

Spring MVC 檔案工具類

public class UploadFiles { /** * 檔案的名稱 */ private String name; /** * 檔案的新的名稱 */ private String uuidname; /**

SpringMVC之檔案進度顯示)

親測可用 1、mvc-config.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"   

純H5 AJAX檔案進度功能

上傳程式碼js部分 //包上傳 $('.up_apk').change(function () { var obj = $(this); var form_data = new FormData(); // 獲取檔案 var fi

檔案進度(fileupload控制元件)

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">之前的專案一直沒有涉及到達的檔案上傳,所以沒有用到進度條,這幾天不忙,所

spring mvc 檔案並攜帶其他引數

這是主要使用到的jar 檔案是:spring mvc +apache common-fileuplad  第一步:web.xml 檔案。【重點是spring mvc的攔截器和相關監聽器】 <?xml version="1.0" encoding="UTF-8"?&g

Bootstrap file-input 外掛使用(大檔案顯示進度)

Bootstrap file-input 是一個檔案上傳的外掛 ,使用之後會使檔案上傳變得特別簡單. 方法: 1.新增css和js支援 fileinput.min.css和fileinput.min.js是必須的,其他根據情況新增 除了外掛需要的js

Springboot 檔案(帶進度)

1. 相關依賴 pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="htt

servlet3.0之ajax檔案進度

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <h

java struts2 多檔案進度

摘要   實現批量上傳,同時又進度顯示和上傳速度 1、struts.xml檔案配置 <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN

Spring MVC檔案出現錯誤:Required MultipartFile parameter 'file' is not present

1.配置檔案上傳的解析器 首先需要在spring mvc的配置檔案中(注意是spring mvc的配置檔案而不是spring的配置檔案:applicationContext.xml)配置: springmvc-config.xml <!-- 檔案上傳bean--> <

Java架構-Spring mvc+oss儲存+fileupload多檔案實現SSO單點登入模板管理

之前給大家介紹了sso的相關知識點和整合方案,考慮到每個系統所屬行業的不同,這邊針對於不同行業做了一些統一的sso單點登入介面模板,使用fileupload多檔案上傳+OSS阿里雲端儲存方案。 1. 阿里雲oss儲存Utils Java程式碼 2. 阿里雲配

atitit.文件進度實現原理and組件選型and最佳實踐總結O7

private tps cto 協議 post sch 頁面 system osc atitit.文件上傳帶進度條的實現原理and組件選型and最佳實踐總結O7 1. 實現原理 1 2. 大的文件上傳原理::使用applet 1 3. 新的bp 2 1. 性能提升

jquery 實現拖動文件進度

進行 con pos rip file round 默認 dex toupper 通過對文件的拖動實現文件的上傳,主要用到的是HTML5的ondrop事件,上傳內容通道FormData傳輸: //進度條 <div class="parent-dlg" >

基於DiskFileItemFactory實現檔案進度監聽

             10月1假期圓滿結束,在家裡躺了5天,啥也沒幹,回來的時候家裡還給我拿了螃蟹什麼的,昨天就讓我吃了,哈哈哈。               這幾天一直想實現以下檔案的上傳和檔案上傳時顯示進度條,看了幾個部落格,照著自己敲了一下,將自己不明白的地方也查

Spring Cloud Feign的檔案實現

在Spring Cloud封裝的Feign中並不直接支援傳檔案,但可以通過引入Feign的擴充套件包來實現,本來就來具體說說如何實現。服務提供方(接收檔案)服務提供方的實現比較簡單,就按Spring MVC的正常實現方式即可,比如:@EnableFeignClients @E