用Java實現文件下載也不用多說了,讀取文件,經過二進制流的方式往response裏寫就好了。H5播放器調用也能進行播放了;然而當我控制進度的前進和後退時,問題來了,竟然一點效果都沒有!沒有快進播放器還叫播放器嗎? java
首先看到播放器沒法取得音視頻文件的時間長度,很天然想到Content-Length屬性,後臺經過file.length()取得文件長度並設置到Content-Length上(代碼以下),前臺播放器裏能夠顯示音視頻的長度了,而且能夠快進了;然而當我快退的時候,仍是無效,同時後臺報錯。
測試
response.addHeader("Content-Length", file.length());
根據上面的分析,咱們就知道在服務端該怎麼處理了,首先在響應頭上添加Accept-Ranges。 this
response.setHeader("Accept-Ranges", "bytes");
接着判斷request中是否存在Range屬性,便是否指定的起點,若存在,則經過stream的skip直接跳到目標起點,最後添加Content-Range屬性表名當前塊的起始和結束,完整代碼以下: spa
stream = new FileInputStream(file); if(request.getHeader("Range") != null) //客戶端請求的下載的文件塊的開始字節 { //從請求中獲得開始的字節 //請求的格式是: //Range: bytes=[文件塊的開始字節]- String range = StringUtils.substringBetween(request.getHeader("Range"), "bytes=", "-"); long start = Long.parseLong(range); //下載的文件(或塊)長度 //響應的格式是: //Content-Length: [文件的總大小] - [客戶端請求的下載的文件塊的開始字節] response.setHeader("Content-Length", String.valueOf(fileSize - start)); if (start != 0) { //要設置狀態 //響應的格式是: //HTTP/1.1 206 Partial Content response.setStatus(javax.servlet.http.HttpServletResponse.SC_PARTIAL_CONTENT);//206 //不是從最開始下載, //響應的格式是: //Content-Range: bytes [文件塊的開始字節]-[文件的總大小 - 1]/[文件的總大小] response.setHeader("Content-Range","bytes " + start + "-" + String.valueOf(fileSize - 1) + "/" + String.valueOf(fileSize)); stream.skip(start); } } responseBinaryStream(response, this.getContentType(FilenameUtils.getExtension(fileName)), stream);