`
zhangfy068
  • 浏览: 148458 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

HTTP访问网络下载文件

 
阅读更多

/**
 * 
 */
package org.crazyit.net;

import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.URL;

/**
 * Description:
 * <br/>网站: <a href="http://www.crazyit.org">疯狂Java联盟</a> 
 * <br/>Copyright (C), 2001-2012, Yeeku.H.Lee
 * <br/>This program is protected by copyright laws.
 * <br/>Program Name:
 * <br/>Date:
 * @author  Yeeku.H.Lee kongyeeku@163.com
 * @version  1.0
 */
public class DownUtil
{
	// 定义下载资源的路径
	private String path;
	// 指定所下载的文件的保存位置
	private String targetFile;
	// 定义需要使用多少线程下载资源
	private int threadNum;
	// 定义下载的线程对象
	private DownloadThread[] threads;
	// 定义下载的文件的总大小
	private int fileSize;

	public DownUtil(String path, String targetFile, int threadNum)
	{
		this.path = path;
		this.threadNum = threadNum;
		// 初始化threads数组
		threads = new DownloadThread[threadNum];
		this.targetFile = targetFile;
	}

	public void download() throws Exception
	{
		URL url = new URL(path);
		HttpURLConnection conn = (HttpURLConnection) url.openConnection();
		conn.setConnectTimeout(5 * 1000);
		conn.setRequestMethod("GET");
		conn.setRequestProperty(
			"Accept",
			"image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/xaml+xml, application/vnd.ms-xpsdocument, application/x-ms-xbap, application/x-ms-application, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*");
		conn.setRequestProperty("Accept-Language", "zh-CN");
		conn.setRequestProperty("Charset", "UTF-8");
		conn.setRequestProperty(
			"User-Agent",
			"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)");
		conn.setRequestProperty("Connection", "Keep-Alive");
		// 得到文件大小
		fileSize = conn.getContentLength();
		conn.disconnect();
		int currentPartSize = fileSize / threadNum + 1;
		RandomAccessFile file = new RandomAccessFile(targetFile, "rw");
		// 设置本地文件的大小
		file.setLength(fileSize);
		file.close();
		for (int i = 0; i < threadNum; i++)
		{
			// 计算每条线程的下载的开始位置
			int startPos = i * currentPartSize;
			// 每个线程使用一个RandomAccessFile进行下载
			RandomAccessFile currentPart = new RandomAccessFile(targetFile,
				"rw");
			// 定位该线程的下载位置
			currentPart.seek(startPos);
			// 创建下载线程
			threads[i] = new DownloadThread(startPos, currentPartSize,
				currentPart);
			// 启动下载线程
			threads[i].start();
		}
	}

	// 获取下载的完成百分比
	public double getCompleteRate()
	{
		// 统计多条线程已经下载的总大小
		int sumSize = 0;
		for (int i = 0; i < threadNum; i++)
		{
			sumSize += threads[i].length;
		}
		// 返回已经完成的百分比
		return sumSize * 1.0 / fileSize;
	}

	private class DownloadThread extends Thread
	{
		// 当前线程的下载位置
		private int startPos;
		// 定义当前线程负责下载的文件大小
		private int currentPartSize;
		// 当前线程需要下载的文件块
		private RandomAccessFile currentPart;
		// 定义已经该线程已下载的字节数
		public int length;

		public DownloadThread(int startPos, int currentPartSize,
			RandomAccessFile currentPart)
		{
			this.startPos = startPos;
			this.currentPartSize = currentPartSize;
			this.currentPart = currentPart;
		}

		@Override
		public void run()
		{
			try
			{
				URL url = new URL(path);
				HttpURLConnection conn = (HttpURLConnection) url
					.openConnection();
				conn.setConnectTimeout(5 * 1000);
				conn.setRequestMethod("GET");
				conn.setRequestProperty(
					"Accept",
					"image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/xaml+xml, application/vnd.ms-xpsdocument, application/x-ms-xbap, application/x-ms-application, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*");
				conn.setRequestProperty("Accept-Language", "zh-CN");
				conn.setRequestProperty("Charset", "UTF-8");
				InputStream inStream = conn.getInputStream();
				// 跳过startPos个字节,表明该线程只下载自己负责哪部分文件。
				inStream.skip(this.startPos);
				byte[] buffer = new byte[1024];
				int hasRead = 0;
				// 读取网络数据,并写入本地文件
				while (length < currentPartSize
					&& (hasRead = inStream.read(buffer)) != -1)
				{
					currentPart.write(buffer, 0, hasRead);
					// 累计该线程下载的总大小
					length += hasRead;
				}
				currentPart.close();
				inStream.close();
			}
			catch (Exception e)
			{
				e.printStackTrace();
			}
		}
	}
}
 
分享到:
评论

相关推荐

    java访问https网址下载文件

    记得在完成文件下载后关闭连接以释放资源: ```java conn.disconnect(); ``` 6. **处理异常**: 在整个过程中,需要捕获可能出现的异常,例如网络连接问题、证书问题等,确保程序的健壮性。 以上就是使用...

    通过访问https服务器链接,下载文件

    总之,这个项目展示了如何使用C++和WinHTTP库实现HTTPS协议下的文件下载功能,涉及到了网络安全、面向对象编程和Windows API等多个IT领域的核心技术。开发者可以通过学习和理解这个项目,提升自己的网络编程和C++...

    java访问https网址下载文件(含证书)

    调用`connect()`方法建立实际的网络连接,然后通过`getInputStream()`获取服务器的响应流,准备下载文件。同时,创建一个本地文件的`FileOutputStream`用于写入接收到的数据。 5. **下载文件**: 使用`...

    nginx访问静态文件不下载.rar

    假设你遇到的问题是,当访问`http://example.com/images/logo.png`时,浏览器开始下载文件而不是显示图片。首先,确保`location`块中有正确的配置,例如: ``` location /images/ { root /var/www/html; try_...

    pb实现http文件下载功能--源代码 可以直接使用

    标题中的“pb实现http文件下载功能--源代码 可以直接使用”指的是使用PowerBuilder(简称PB)编程语言实现HTTP协议进行文件下载的功能,并且提供了可以直接使用的源代码。这个功能在软件开发中常用于实现自动更新...

    java 访问网络 下载文件 爬虫 超时处理解决方案

    在IT领域,尤其是在Java编程中,访问网络、下载文件、实现爬虫功能以及处理超时问题是非常关键的技术点。本文将深入探讨如何在Java中有效处理这些方面的问题,特别是超时处理解决方案,这对于构建高效、稳定的网络...

    易语言Http文件下载模块2个不同类型的

    在易语言中,开发网络应用程序是常见的应用场景之一,其中HTTP文件下载模块是实现网络数据传输的重要组成部分。 本主题涉及的是两个不同类型的易语言Http文件下载模块,它们提供了对HTTP协议的支持,允许程序通过...

    http文件下载模拟器,模拟文件下载的http服务器

    在IT领域,进行网络应用开发和测试时,模拟HTTP文件下载服务器是一种常见的需求。这样的工具能够帮助开发者在本地环境中模拟实际的文件下载过程,以便进行功能验证、性能测试或者问题排查。本文将详细探讨“HTTP文件...

    C++http下载文件

    使用WinINet进行文件下载,可以避免开发者直接处理底层网络细节,使得代码更加简洁和易于维护。 1. **初始化WinINet库**:在使用WinINet API之前,需要先调用`InternetOpen()`函数来初始化一个会话。这个函数通常...

    通过tcp模拟http文件下载

    在TCP协议基础上模拟HTTP文件下载是一项技术挑战,它要求我们理解TCP/IP协议栈的基本工作原理以及HTTP协议的请求和响应机制。在这个过程中,我们将主要关注以下几个核心知识点: 1. **TCP/IP协议**:TCP(传输控制...

    HTTP从文件服务器下载文件

    总的来说,HTTP从文件服务器下载文件涉及到网络通信的基本原理、HTTP协议的工作方式以及实际应用中的各种技术细节,包括请求响应机制、URL定位、附件下载等。理解这些概念对于进行Web开发、网络管理和日常的文件共享...

    android开发--访问网络,保存文件,http访问

    以上就是Android开发中关于访问网络、保存文件以及HTTP访问的基本知识点。理解并掌握这些技能,将有助于开发出功能完善的Android应用。在实际项目中,还需要注意网络连接的错误处理、异步操作、缓存策略等细节。

    制作个php网页,当访问该PHP页面时自动下载文件,本例为下载APK APP安装包.zip

    当用户访问PHP页面时,服务器需要通过HTTP响应头来指示浏览器进行文件下载而非直接渲染内容。在PHP中,可以通过`header()`函数设置`Content-Type`和`Content-Disposition`等头信息来实现这一目标。例如: ```php ...

    qt实现https协议文件下载

    对于"qt实现https协议文件下载"这一主题,我们将深入探讨如何利用Qt库来实现安全的HTTPS协议文件下载。 首先,我们需要理解HTTPS协议。HTTPS(HyperText Transfer Protocol Secure)是一种通过SSL或TLS加密的HTTP...

    SpringBoot 实现文件上传到本地目录 并返回可访问的文件地址.rar

    - **日志记录**:记录文件上传和下载的事件,以便于监控和排查问题。 8. **单元测试**: 对文件上传和访问功能进行单元测试,确保代码的正确性。可以使用MockMultipartFile来模拟文件上传请求,然后验证文件是否...

    即时访问网络图片文件展示---HttpURLConnection

    标题中的“即时访问网络图片文件展示---HttpURLConnection”是指通过Java的HttpURLConnection类来实现从网络上获取并显示图片的功能。HttpURLConnection是Java标准库提供的一种HTTP协议的网络连接工具,它允许应用...

    C#多线程文件下载工具(访问restful形式接口)

    总的来说,这个C#多线程文件下载工具是一个综合性的解决方案,它涵盖了网络通信(通过HTTPClient访问REST API)、多线程下载以提高效率、本地数据存储(使用SQLite)以及文件压缩(使用ZipFile)。这样的工具对于...

    qt多线程高效下载文件

    本项目"qt多线程高效下载文件"是基于Qt实现的一个实用工具,它利用多线程技术来提高文件下载的效率,特别是对于大文件或者需要同时下载多个文件的场景,这种多线程策略显得尤为重要。 在HTTP协议方面,它是互联网上...

    java使用HttpClient通过url下载文件到本地

    在Java编程环境中,HttpClient库是Apache HTTP Components项目的一部分,它为开发者提供了强大的HTTP客户端功能,可以...通过理解HttpClient的工作原理和提供的API,开发者可以构建出稳定、高效的文件下载解决方案。

    Web Api 通过文件流 下载文件到本地实例

    通过分析这个项目,你可以看到如何在`Controllers`目录下的某个控制器类中实现文件下载的方法,以及如何配置路由来确保客户端可以通过正确的URL访问这个服务。你还可以学习到如何在`Global.asax.cs`或`Startup.cs`中...

Global site tag (gtag.js) - Google Analytics