HttpClient获取文件流的一部分,该怎么解决

HttpClient获取文件流的一部分,该怎么解决,第1张

在请求头里设置Range,可以拿到不同的部分,前提还需要web server支持。

      

/** 

 * 开始下载 

 * @throws Exception 

 */  

public void startDown() throws Exception{  

    HttpClient httpClient = new DefaultHttpClient()  

    try {  

        //获取下载文件信息  

        getDownloadFileInfo(httpClient)  

        //启动多个下载线程  

        startDownloadThread()  

        //开始监视下载数据  

        monitor()  

    } catch (Exception e) {  

        throw e  

    } finally {  

        httpClient.getConnectionManager().shutdown()  

    }  

}  

  

/** 

 * 获取下载文件信息 

 */  

private void getDownloadFileInfo(HttpClient httpClient) throws IOException,  

        ClientProtocolException, Exception {  

    HttpHead httpHead = new HttpHead(url)  

    HttpResponse response = httpClient.execute(httpHead)  

    //获取HTTP状态码  

    int statusCode = response.getStatusLine().getStatusCode()  

  

    if(statusCode != 200) throw new Exception("资源不存在!")  

    if(getDebug()){  

        for(Header header : response.getAllHeaders()){  

            System.out.println(header.getName()+":"+header.getValue())  

        }  

    }  

  

    //Content-Length  

    Header[] headers = response.getHeaders("Content-Length")  

    if(headers.length > 0)  

        contentLength = Long.valueOf(headers[0].getValue())  

  

    httpHead.abort()  

      

    httpHead = new HttpHead(url)  

    httpHead.addHeader("Range", "bytes=0-"+(contentLength-1))  

    response = httpClient.execute(httpHead)  

    if(response.getStatusLine().getStatusCode() == 206){  

        acceptRanges = true  

    }  

    httpHead.abort()  

}  

  

/** 

 * 启动多个下载线程 

 * @throws IOException 

 * @throws FileNotFoundException 

 */  

private void startDownloadThread() throws IOException,  

        FileNotFoundException {  

    //创建下载文件  

    File file = new File(localPath)  

    file.createNewFile()  

    RandomAccessFile raf = new RandomAccessFile(file, "rw")  

    raf.setLength(contentLength)  

    raf.close()  

      

    //定义下载线程事件实现类  

    DownloadThreadListener listener = new DownloadThreadListener() {  

        public void afterPerDown(DownloadThreadEvent event) {  

            //下载完一个片段后追加已下载字节数  

            synchronized (object) {  

                DownloadTask.this.receivedCount += event.getCount()  

            }  

        }  

  

        public void downCompleted(DownloadThreadEvent event) {  

            //下载线程执行完毕后从主任务中移除  

            threads.remove(event.getTarget())  

            if(getDebug()){  

                System.out.println("剩余线程数:"+threads.size())  

            }  

        }  

    }  

      

    //不支持多线程下载时  

    if (!acceptRanges) {  

        if(getDebug()){  

            System.out.println("该地址不支持多线程下载")  

        }  

        //定义普通下载  

        DownloadThread thread = new DownloadThread(url, 0, contentLength, file, false)  

        thread.addDownloadListener(listener)  

        thread.start()  

        threads.add(thread)  

        return  

    }  

      

    //每个请求的大小  

    long perThreadLength = contentLength / threadCount + 1  

    long startPosition = 0  

    long endPosition = perThreadLength  

    //循环创建多个下载线程  

    do{  

        if(endPosition >= contentLength)  

            endPosition = contentLength - 1  

  

        DownloadThread thread = new DownloadThread(url, startPosition, endPosition, file)  

        thread.addDownloadListener(listener)  

        thread.start()  

        threads.add(thread)  

  

        startPosition = endPosition + 1//此处加 1,从结束位置的下一个地方开始请求  

        endPosition += perThreadLength  

    } while (startPosition < contentLength)  

}

vc6使用httpclient需要相关的库。根据查询相关公开信息,VC6使用HTTPClient需要相关的库,可以从网上下载相应的lib文件,放到VC6的库文件夹中,然后使用#include"htttpclient.h"来包含httpclient库。具体的使用方法详见官方文档或可以参考相关的链接。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/tougao/11512873.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存