java斷點續傳插件_視頻斷點續傳+java視頻

之前仿造uploadify寫了一個HTML5版的文件上傳插件,沒看過的朋友可以點此先看一下~得到了不少朋友的好評,我自己也用在了項目中,不論是用戶頭像上傳,還是各種媒體文件的上傳,以及各種個性的業務需求,都能得到滿足。小小開心了一把。

但無論插件再怎么靈活,也難以應付所有的需求,比如,你要上傳一個2G的文件。以現在我們的網速,恐怕再快也得傳半小時。要命的是,如果你在上傳到90%的時候不小心關掉了瀏覽器,或者是手一抖摁了F5,完了,一切還得從頭再來。這種用戶體驗簡直太糟糕了。所以,斷點續傳就十分有必要了。什么是續傳我就不解釋了,用QQ傳文件這么多年,大家都見過了。

這里要說的是斷點續傳都有哪些技術要點。使用傳統的表單提交文件或是HTML5的FormData都是將文件“整塊”提交,服務端取到該文件后再進行轉移、重命名等操作,因此,無法實時保存文件的已上傳部分。而且在http協議下,我們無法保持瀏覽器與服務端的長連接,不能以文件流的形式來提交。所以要解決的問題具體來講有以下幾點:

對上傳的文件進行分割,每次只上傳一小片。服務端接收到文件后追加到原來部分,最后合并成完整的文件。

每次上傳文件片前先獲取已上傳的文件大小,確定本次應切割的位置

每次上傳完成后更新已上傳文件大小的記錄

標識客戶端和服務端的文件,保證不會把A文件的內容追加到B文件上

在參考了張鑫旭大哥的這篇文章后,我將學到的技術應用在了我的插件Huploadify中,成功的添加了斷點續傳功能。在此將技術和插件都分享給大家。

工作原理/技術要點

首先的首先,要明確,如果我們有一個10M的文件,每次切割上傳1M,那么是需要發10次請求來完成的。在http協議下,只能這么搞。斷點上傳分三步來完成:

選擇一個文件后,獲取該文件在服務器上的大小,通過本地存儲或自定義的函數來獲取。

根據已上傳大小切割文件,發出n次請求不斷向服務器提交文件片,服務端不斷追加文件內容

當已上傳文件大小達到文件總大小時,上傳結束

首先是文件的分割,HTML5新增了Blob數據類型,并且提供了一個可以分割數據的方法:slice(),其用法和字符串、數組的slice()方法一樣,可以截取一個二進制文件的一部分。

其次是文件片的保存與追加,我后臺用PHP寫的,先用file_get_contents獲取文件的二進制格式,再用file_put_contents每次將文件追加,具體的寫法可以參照后面,或者是下載我打包好的文件。

接下來我們還需要實時保存已上傳文件的大小,以便于下次上傳前進行正確切割。使用HTML5的localStorage是一種方法,將已上傳的大小保存在本地,下次上傳前先從本地讀取。不過這種方式是很局限的,拋開用戶可能通過各種管家清除掉本地數據不講,假如用戶在A頁面上傳了一個文件的50%,然后在B頁面想把該文件上傳到另外一個地方,結果從本地一讀文件已上傳50%了,直接從51%的位置開始上傳了,顯然是個錯誤。問題就在于本地不能存太多的信息,通過File API只能獲取到文件的原始名稱,無法正確的與服務器上的文件正確匹配。所以真正在項目中用,還得依靠服務端來保存這些數據。

關于如何將數據存在服務端,已經前端如何取數據,我在下面會講到。

技術要點就上面的那么多了,其實也沒有多少技術含量哈~來看看我的插件如何使用吧。

續傳功能的使用方法

文件的引入就不講了,可參考上一篇關于插件的介紹。關鍵點是新增的幾個配置,先來看一下:

b9d2be9db4e2b67bdc18c6f696b70d79.pngwAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==?

在服務端保存數據

用戶在使用上傳的時候可能有各種你意想不到的操作,這里我發揮想象描述一下用戶可能的行為:

同一臺機器使用不同帳號登錄,上傳同一個文件

文件上傳了一部分,然后修改了文件內容,再次上傳

文件上傳完成100%,再次上傳該文件

同一個頁面有多個上傳按鈕,上傳同一個文件,或在不同頁面上傳同一個文件

僅僅上面四條,是不是情況就夠復雜了?再加上你系統還有自己的業務邏輯,所以在服務端保存已上傳文件數據是非常有必要的。而且保存數據和獲取數據的函數都交給你來定義,抱著插件有足夠的靈活性。

因為涉及到了服務端的技術,無法演示,我將我項目中的真實使用場景在此講解一下,來展示一下如何自已定義方法來實現服務端保存數據的可靠上傳。我定義的getUploadedSize函數如下:

文件初始化

6d9d2f1c30246f1b5cccaf4e5cb8c00e.pngwAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==?

文件上傳完畢的代碼

996604af0fc4b959a28cfb6b1f04b9f0.pngwAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==?

文件塊的處理代碼,up6對文件塊的處理,以及文件續傳的邏輯進行了大幅度的優化,開發者不需要關心續傳的細節,因為up6默認就是自動續傳

12938c12d3a706e50e999fc2f318311b.pngwAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==?

我向后臺的某個地址發送一個請求,傳遞文件名和文件的最后修改時間為參數,后臺根據這兩個參數來找到與前臺所選擇的文件對應的服務器上的文件,將服務器返回的文件大小return出去,來被插件使用。為什么要傳遞這兩個參數呢?我們在前臺無法知道服務器上的這個文件的名稱,所以使用原始文件名作為一個輔助標識。為了防止用戶在兩次上傳間隔修改了文件,我們把文件的最后修改時間也傳給服務端,讓服務端進行比較,若時間不對應則返回已上傳大小為0,重新上傳此文件。

再來看后臺都要做哪些工作。數據庫中需要有一張表來記錄每個已文件的情況,包含的字段大致有:字段描述

uid用戶ID

id文件ID標識(唯一)

lenSvr服務器文件大小

lenLoc本地文件大小

blockOffset文件塊偏移(在整個文件中的位置)

blockSize文件塊大小

blockIndex文件塊索引(基于1)

blockMd5文件塊MD5

complete當前文件是否已經傳完

根據client_filename和last_modified_date,再加上系統中的其他關聯信息,可以定位到本次上傳的文件在服務端的大小,然后返回給客戶端。當然這是我自己的用法,你也可以根據自己的需求靈活設計。總之最終的目的就是要找到前臺選擇的文件在服務器上真正對應的文件,并將已上傳大小正確返回。

另外需注意的一點,就是在續傳的第二步,不斷提交文件片的過程中,也需要服務端準確定位到相應的文件,不能把A的數據追加到B上。采用的方式也是提交fileName和lastModifyDate兩個參數(已寫在插件內部,可服務端直接獲取),服務端找到對應的文件進行追加。

另外再啰嗦一句,后臺獲取文件的時候需要取成二進制的,而我們提交是使用FormData來提交的,所以PHP代碼需要這么寫:

file_put_contents('uploads/'.$filename,file_get_contents($_FILES["file"]["tmp_name"]),FILE_APPEND);

如果上面的說明還是不夠清楚,就需要你自己來探索一下了,畢竟考慮到插件可能應用在復雜的系統中,很多工作還是需要你來做的。或者你也可以給我留言,我很樂意為你解答疑惑。

該版本的其他改動

從1.0到2.0,Huploadify又新加了很多東西,不過只是新加,使用方式跟之前的沒有變化。例如上面的斷點續傳功能,你如果不想使用,只需設置breakPoints為false即可,插件仍按照以前的方式工作。除了斷點續傳這個大頭,插件還做了如下改動:

增加了onSelect回調函數,在選擇了文件之后觸發,用法與uploadify官網的一致

up6提供了3個事件,選擇文件,選擇文件夾,粘貼

用戶選擇文件時會觸發open_files,選擇文件夾觸發open_folders,粘貼會觸發以上兩個事件,因為用戶可能粘貼的文件和文件夾

cced05dcbe7e07ecfcef845dba7941bb.pngwAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==?

刪除掉正在上傳的文件,中斷發送請求

完善了input file組件的accept屬性支持,瀏覽時只顯示運行的文件格式,就是這個東東:

ff86ccaae3b84a28137f3805fe07b26e.pngwAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==?

4.?對外開放了方法調用接口,upload、stop、cancel、disable、ennable。我在demo中有演示。使用方法如下:var up = $('#upload').Huploadify({

auto:false,

fileTypeExts:'*.jpg;*.png;*.exe;*.mp3;*.mp4;*.zip;*.doc;*.docx;*.ppt;*.pptx;*.xls;*.xlsx;*.pdf',

multi:true

});

up.upload(1);//開始上傳文件,接收一個參數,表示上傳第幾個文件,可傳入*上傳隊列中的所有文件

up.stop();//暫停上傳隊列中的所有文件,不接收參數。用于開啟了斷點需傳

up.cancel(1);//刪除隊列中的某個文件,接收一個參數,表示刪除第幾個文件,可傳入*刪除隊列中的所有文件

up.disable();//使選擇文件按鈕失效,不接收參數

up.ennable();//使選擇文件按鈕生效,不接收參數??5. 修改其他已知bug

結束

插件剛剛完成,與我們的后端程序員調試完成了斷點續傳功能暫未發現問題,歡迎大家在使用的時候給我提任何問題。老實來講這個功能使用起來還是挺費解的,為了最大程度的保證靈活做成這樣,大家可以與我多多交流~

我在demo中使用了本地存儲來做已上傳文件大小的保存,下載壓縮包后可看一下效果。上傳一個比較大的視頻文件,上傳到中間關閉瀏覽器,再次打開瀏覽器上傳同一個文件,會看到從上次斷掉的地方繼續上傳。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/392448.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/392448.shtml
英文地址,請注明出處:http://en.pswp.cn/news/392448.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

全棧入門_啟動數據棧入門包(2020)

全棧入門I advise a lot of people on how to build out their data stack, from tiny startups to enterprise companies that are moving to the cloud or from legacy solutions. There are many choices out there, and navigating them all can be tricky. Here’s a brea…

Go-json解碼到接口及根據鍵獲取值

Go-json解碼到接口及根據鍵獲取值 package mainimport ("encoding/json""fmt""github.com/bitly/go-simplejson" )type JsonServer struct {ServerName stringServerIP string }type JsonServers struct {Servers []JsonServer }func main() {…

C#接口的顯隱實現

顯示接口實現與隱式接口實現 何為顯式接口實現、隱式接口實現?簡單概括,使用接口名作為方法名的前綴,這稱為“顯式接口實現”;傳統的實現方式,稱為“隱式接口實現”。下面給個例子。 IChineseGreeting接口,…

亞馬遜 各國站點 鏈接_使用Amazon S3和HTTPS的簡單站點托管

亞馬遜 各國站點 鏈接by Georgia Nola喬治亞諾拉(Georgia Nola) 使用Amazon S3和HTTPS的簡單站點托管 (Simple site hosting with Amazon S3 and HTTPS) Hiya folks!大家好! In this tutorial I’ll show you how to host a static website with HTTPS on AWS wit…

leetcode 387. 字符串中的第一個唯一字符(hash)

給定一個字符串,找到它的第一個不重復的字符,并返回它的索引。如果不存在,則返回 -1。 示例: s “leetcode” 返回 0 s “loveleetcode” 返回 2 class Solution { public int firstUniqChar(String s) { int[][] tempnew i…

marlin 三角洲_三角洲湖泊和數據湖泊-入門

marlin 三角洲Data lakes are becoming adopted in more and more companies seeking for efficient storage of their assets. The theory behind it is quite simple, in contrast to the industry standard data warehouse. To conclude this this post explains the logica…

tomcat中設置Java 客戶端程序的http(https)訪問代理

1、假定http/https代理服務器為 127.0.0.1 端口為8118 2、在tomcat/bin/catalina.sh腳本文件中設置JAVA_OPTS,如下圖: 保存后重啟tomcat就能生效。轉載于:https://www.cnblogs.com/zhangmingcheng/p/11211776.html

java界面中顯示圖片_java中怎樣在界面中顯示圖片?

方法一:JLabel helloLabel new JLabel("New label");helloLabel.setIcon(new ImageIcon("E:\\javaSE\u4EE3\u7801\\TimeManager\\asset\\hello.gif"));helloLabel.setBackground(Color.BLACK);helloLabel.setBounds(0, 0, 105, 50);contentPan…

one-of-k 編碼算法_我們如何教K-12學生如何編碼

one-of-k 編碼算法by Christopher George克里斯托弗喬治(Christopher George) 我們如何教K-12學生如何編碼 (How we’re teaching K-12 students how to code) Hello World! (Sorry, I couldn’t resist.) My name is Christopher George and I am currently a Junior at Carn…

knime簡介_KNIME簡介

knime簡介Data Science is abounding. It considers different realms of the data world including its preparation, cleaning, modeling, and whatnot. To be precise, it is massive in terms of the span it covers and the opportunities it offers. Needless to say, th…

hadoop2.x HDFS快照介紹

說明:由于近期正好在研究hadoop的快照機制。看官網上的文檔講的非常仔細。就順手翻譯了。也沒有去深究一些名詞的標準譯法,所以可能有些翻譯和使用方法不是非常正確,莫要介意~~ 原文地址:(Apache hadoop的官方文檔&…

MQTT服務器搭建--Mosquitto用戶名密碼配置

前言: 基于Mosquitto服務器已經搭建成功,大部分都是采用默認的是允許匿名用戶登錄模式,正式上線的系統需要進行用戶認證。 1.用戶參數說明 Mosquitto服務器的配置文件為/etc/mosquitto/mosquitto.conf,關于用戶認證的方式和讀取的…

java number string_java基礎系列(一):Number,Character和String類及操作

這篇文章總結了Java中最基礎的類以及常用的方法,主要有:Number,Character,String。1、Number類在實際開發的過程中,常常會用到需要使用對象而不是內置的數據類型的情形。所以,java語言為每個內置數據類型都…

誰參加了JavaScript 2018狀況調查?

by Sacha Greif由Sacha Greif 誰參加了JavaScript 2018狀況調查? (Who Took the State of JavaScript 2018 Survey?) 我們如何努力使調查更具代表性 (How we’re working to make the survey more representative) I was recently listening to a podcast episode…

機器學習 建立模型_建立生產的機器學習系統

機器學習 建立模型When businesses plan to start incorporating machine learning to enhance their solutions, they more often than not think that it is mostly about algorithms and analytics. Most of the blogs/training on the matter also only talk about taking …

CDH使用秘籍(一):Cloudera Manager和Managed Service的數據庫

背景從業務發展需求,大數據平臺須要使用spark作為機器學習、數據挖掘、實時計算等工作,所以決定使用Cloudera Manager5.2.0版本號和CDH5。曾經搭建過Cloudera Manager4.8.2和CDH4,在搭建Cloudera Manager5.2.0版本號的時候,發現對…

leetcode 455. 分發餅干(貪心算法)

假設你是一位很棒的家長,想要給你的孩子們一些小餅干。但是,每個孩子最多只能給一塊餅干。 對每個孩子 i,都有一個胃口值 g[i],這是能讓孩子們滿足胃口的餅干的最小尺寸;并且每塊餅干 j,都有一個尺寸 s[j]…

壓縮/批量壓縮/合并js文件

寫在前面 如果文件少的話,直接去網站轉化一下就行。 http://tool.oschina.net/jscompress?type3 1.壓縮單個js文件 cnpm install uglify-js -g 安裝 1>壓縮單個js文件打開cmd,目錄引到當前文件夾,cduglifyjs inet.js -o inet-min.js 或者 uglifyjs i…

angular依賴注入_Angular依賴注入簡介

angular依賴注入by Neeraj Dana由Neeraj Dana In this article, we will see how the dependency injection of Angular works internally. Suppose we have a component named appcomponent which has a basic and simple structure as follows:在本文中,我們將看…

leetcode 85. 最大矩形(dp)

給定一個僅包含 0 和 1 、大小為 rows x cols 的二維二進制矩陣,找出只包含 1 的最大矩形,并返回其面積。 示例 1: 輸入:matrix [[“1”,“0”,“1”,“0”,“0”],[“1”,“0”,“1”,“1”,“1”],[“1”,“1”,“1”,“1”,“…