加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java视频流的断点续传功能

发布时间:2020-12-15 06:42:38 所属栏目:Java 来源:网络整理
导读:项目中需要实现浏览器中视频的拖动问题解决 /** * 视频文件的断点续传功能 * @param path 文件路径 * request request * response response */ public void voidPlay(String path,HttpServletRequest request,HttpServletResponse response) { BufferedInput

项目中需要实现浏览器中视频的拖动问题解决

    /**
     * 视频文件的断点续传功能
     * @param path 文件路径
     *  request request
     *  response response
     */
    public void voidPlay(String path,HttpServletRequest request,HttpServletResponse response) {
        BufferedInputStream bis = null;
        try {
            File file = new File(path);
            if (file.exists()) {
                long p = 0L;
                long toLength = 0Llong contentLength = 0Lint rangeSwitch = 0; // 0,从头开始的全文下载;1,从某字节开始的下载(bytes=27000-);2,从某字节开始到某字节结束的下载(bytes=27000-39000)
                long fileLength;
                String rangBytes = "";
                fileLength = file.length();

                 get file content
                InputStream ins =  FileInputStream(file);
                bis =  BufferedInputStream(ins);

                 tell the client to allow accept-ranges
                response.reset();
                response.setHeader("Accept-Ranges","bytes");

                 client requests a file block download start byte
                String range = request.getHeader("Range");
                if (range != null && range.trim().length() > 0 && !"null".equals(range)) {
                    response.setStatus(javax.servlet.http.HttpServletResponse.SC_PARTIAL_CONTENT);
                    rangBytes = range.replaceAll("bytes=","");
                    if (rangBytes.endsWith("-")) {  bytes=270000-
                        rangeSwitch = 1;
                        p = Long.parseLong(rangBytes.substring(0,rangBytes.indexOf("-")));
                        contentLength = fileLength - p;  客户端请求的是270000之后的字节(包括bytes下标索引为270000的字节)
                    } else {  bytes=270000-320000
                        rangeSwitch = 2;
                        String temp1 = rangBytes.substring(0,1)">));
                        String temp2 = rangBytes.substring(rangBytes.indexOf("-") + 1,rangBytes.length());
                        p = Long.parseLong(temp1);
                        toLength = Long.parseLong(temp2);
                        contentLength = toLength - p + 1;  客户端请求的是 270000-320000 之间的字节
                    }
                } else {
                    contentLength = fileLength;
                }

                 如果设设置了Content-Length,则客户端会自动进行多线程下载。如果不希望支持多线程,则不要设置这个参数。
                 Content-Length: [文件的总大小] - [客户端请求的下载的文件块的开始字节]
                response.setHeader("Content-Length" 断点开始
                 响应的格式是:
                 Content-Range: bytes [文件块的开始字节]-[文件的总大小 - 1]/[文件的总大小]
                if (rangeSwitch == 1) {
                    String contentRange = new StringBuffer("bytes ").append(new Long(p).toString()).append("-")
                            .append(new Long(fileLength - 1).toString()).append("/" Long(fileLength).toString()).toString();
                    response.setHeader("Content-Range"else if (rangeSwitch == 2) {
                    String contentRange = range.replace("="," ") + "/" + Long.toString(fileLength);
                    response.setHeader("Content-Range" {
                    String contentRange = new StringBuffer("bytes ").append("0-").append(fileLength - 1).append("/")
                            .append(fileLength).toString();
                    response.setHeader("Content-Range" file.getName();
                response.setContentType("application/octet-stream");
                response.addHeader("Content-Disposition","attachment;filename=" + fileName);

                OutputStream out = response.getOutputStream();
                int n = 0long readLength = 0int bsize = 1024byte[] bytes = new byte[bsize];
                ) {
                     针对 bytes=27000-39000 的请求,从27000开始写数据
                    while (readLength <= contentLength - bsize) {
                        n = bis.read(bytes);
                        readLength += n;
                        out.write(bytes,0if (readLength <= contentLength) {
                        n = bis.read(bytes,(int) (contentLength - readLength));
                        out.write(bytes,n);
                    }
                }  {
                    while ((n = bis.read(bytes)) != -1) {
                        out.write(bytes,n);
                    }
                }
                out.flush();
                out.close();
                bis.close();
            }
        } catch (IOException ie) {
             忽略 ClientAbortException 之类的异常
        }  (Exception e) {
            e.printStackTrace();
        }

    }

?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读