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

Java 实现的断点下载

发布时间:2020-12-15 03:19:27 所属栏目:Java 来源:网络整理
导读:今天PHP站长网 52php.cn把收集自互联网的代码分享给大家,仅供参考。 HttpServletRequest / Response HttpClient ServletOutputStream BufferedInputStream /** * @desc 断点下载工具方法 * @param request * @param resp

以下代码由PHP站长网 52php.cn收集自互联网

现在PHP站长网小编把它分享给大家,仅供参考

  • HttpServletRequest / Response
  • HttpClient
  • ServletOutputStream
  • BufferedInputStream
    /** 
         * @desc 断点下载工具方法 
         * @param request 
         * @param response 
         * @param fileLength 
         * @param contentType 
         * @param fileName 
         * @param fileId 
         */  
        public static void resumeDownload(HttpServletRequest request,HttpServletResponse response,Long fileLength,String contentType,String fileName,String fileId) {  
            ServletOutputStream out = null;  
            response.reset();  
      
            // 记录断点续传的开始点  
            long pos = 0;  
            if (null != request.getHeader("Range")) {  
                response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);  
                try {  
                    pos = Long.parseLong(request.getHeader("Range")  
                            .replaceAll("bytes=","").replaceAll("-.*",""));  
                } catch (NumberFormatException e) {  
                    LOGGER.error(e.getMessage(),e);  
                    pos = 0;  
                }  
                String contentRange = new StringBuffer("bytes ").append(pos + "")  
                        .append("-").append((fileLength.intValue() - 1) + "")  
                        .append("/").append(fileLength.intValue() + "").toString();  
                response.setHeader("Content-Range",contentRange);  
            }  
      
            response.setHeader("Accept-Ranges","bytes");  
            response.setHeader("Content-Length",String.valueOf(fileLength.intValue() - pos));  
            response.setCharacterEncoding("UTF-8");  
            response.setContentType(contentType);  
            response.setHeader("Content-disposition","attachment;filename=""  
                    + fileName + """);  
            try {  
                out = response.getOutputStream();  
            } catch (IOException e) {  
                LOGGER.error(e.getMessage(),e);  
            }  
      
            // 断点下载  
            CloseableHttpClient httpClient = HttpClients.createDefault();  
      
            HttpPost httpPost = new HttpPost(SysConf.getString("fezo.download.url"));  
      
            List<NameValuePair> nvps = new ArrayList<NameValuePair>();  
            nvps.add(new BasicNameValuePair(SysConf.getString("fezo.download.param"),fileId));  
              
            HttpResponse httpResponse = null;  
            BufferedInputStream input = null;  
            try {  
                httpPost.setEntity(new UrlEncodedFormEntity(nvps));  
                  
                httpPost.setHeader("Range","bytes=" + pos + "-");  
                httpResponse = httpClient.execute(httpPost);  
      
                input = new BufferedInputStream(httpResponse.getEntity().getContent());  
      
                byte[] buffer = new byte[CommonConstants.BUFFER_SIZE];  
                int len = -1;  
                while ((len = input.read(buffer)) != -1) {  
                    out.write(buffer,len);  
                }  
                out.flush();  
                out.close();  
                input.close();  
            } catch (UnsupportedEncodingException e) {  
                LOGGER.error(e.getMessage(),e);  
            } catch (ClientProtocolException e) {  
                LOGGER.error(e.getMessage(),e);  
            } catch (IOException e) {  
                // 可以忽略这个异常,有可能是用户暂停下载,或者迅雷等下载工具分块下载  
            } finally {  
                try {  
                    if (httpClient != null) httpClient.close();  
                } catch(IOException e) {  
                    LOGGER.error(e.getMessage(),e);  
                }  
            }  
        }  

>>>点击这里下载代码
4. 重点与难点 ??? - 迅雷等多线程分块下载客户端下载的处理:还是要处理好"Range" 和 "Conent-Range" 等头部信息,迅雷会自动将文件内容分块、记录起始位置。

来自:http://blog.csdn.net/alli0968/article/details/47337349

以上内容由PHP站长网【52php.cn】收集整理供大家参考研究

如果以上内容对您有帮助,欢迎收藏、点赞、推荐、分享。

(编辑:李大同)

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

    推荐文章
      热点阅读