使用HTTP协议下载文件

为了测试方便,在自己的电脑上开一个web服务Tomcat,在Tomcat的webapps文件夹里放测试下载用的文件

在cmd的ipconfig指令下查看自己的主机的IP地址。

之前没有接触过Tomcat,就先按网上介绍的安装教程下载Tomcat,并在Eclipse配置好Tomcat

http://blog.chinaunix.net/uid-25434387-id-167705.html

初次安装配置会出现一些错误,但在网上都能找到解决办法,直到Tomcat正常工作

使用HTTP·协议下载文件:

1、创建一个HttpURLConnection对象

HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();

2、获得一个InputStream对象

InputStream inputStream = urlConn.getInputStream();

3、访问网络的权限(需要在AndroidMainfest.xml配置好)

<uses-permission android:name="android.permission.INTERNET"/>

将下载的文件写到SDCard

1、得到当前设备SD卡的目录

SDPATH = Environment.getExternalStorageDirectory() + "/";

2、访问SD的权限(同样需要在AndroidMainfest.xml配置好)

 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

例程:

Download.java

import mars.utils.HttpDownloader;
import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.app.Activity;
import android.os.Build;
import android.os.Bundle;
import android.os.StrictMode;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class Download extends Activity {

	private Button downloadTxtButton;
	private Button downloadMp3Button;
	@TargetApi(Build.VERSION_CODES.GINGERBREAD)
	@SuppressLint("NewApi")
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		downloadTxtButton = (Button)findViewById(R.id.downloadText);
		downloadMp3Button = (Button)findViewById(R.id.downloadMp3);
		downloadTxtButton.setOnClickListener(new OnClickListener(){
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				HttpDownloader httpDownloader = new HttpDownloader();
				String lrc = httpDownloader.download("http://222.199.230.116:8080/mp3/Test-2.lrc");
				System.out.println(lrc);
			}
		});
		downloadMp3Button.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				HttpDownloader httpDownloader = new HttpDownloader();
				int result = httpDownloader.downFile("http://222.199.230.116:8080/mp3/Test-2.mp3","voa/","Test.mp3");
				System.out.println(result);
			}
		});

		StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectDiskReads().
				detectDiskWrites().detectNetwork().penaltyLog().build());

	}

}

注意:

在Android4.0以上的模拟器好像对联网下载文件好像有要求,所以在.java文件要配置:

StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectDiskReads().
				detectDiskWrites().detectNetwork().penaltyLog().build());

刚才没配置一直在报错不能下载

详情请看http://www.cnblogs.com/Lewis/p/3298994.html

FileUtils.java

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import android.os.Environment;

public class FileUtils {
	private String SDPATH;
	public String getSDPATH(){
		return SDPATH;
	}
	public FileUtils(){
		//得到当前外部存储设备的目录
		SDPATH = Environment.getExternalStorageDirectory() + "/";
	}
	/**
	 * 在SD卡上创建文件
	 *
	 * @throws IOException
	 */
	public File createSDFile(String fileName) throws IOException{
		File file = new File(SDPATH + fileName);
		file.createNewFile();
		return file;
	}
	/**
	 * 在SD卡上创建目录
	 *
	 * @param dirName
	 */
	public File createSDDir(String dirName){
		File dir = new File(SDPATH + dirName);
		dir.mkdirs();
		return dir;
	}
	/**
	 * 判断SD卡上的文件夹是否存在
	 */
	public boolean isFileExist(String fileName){
		File file = new File(SDPATH + fileName);
		return file.exists();
	}
	/**
	 * 将一个InputStream里面的数据写入到SD卡中
	 */
	public File write2SDFromInput(String path,String fileName,InputStream input){
		File file = null;
		OutputStream output = null;
		try{
			createSDDir(path);
			file = createSDFile(path + fileName);
			output = new FileOutputStream(file);
			byte buffer [] = new byte[4 * 1024];
			while((input.read(buffer)) != -1){
				output.write(buffer);
			}
			output.flush();
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			try{
				output.close();
			}catch(Exception e){
				e.printStackTrace();
			}

		}
		return file;
	}
}

HttpDownloader.java

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class HttpDownloader {

	private URL url = null;
	/**
	 * 根据URL下载文件,前提是这个文件当中的内容是文本,函数的返回值就是文件当中的内容
	 * 1.创建一个URL对象
	 * 2.通过URL对象,创建一个HttpURLConnection对象
	 * 3.得到InputStram
	 * 4.从InputStream当中读取数据
	 * @param urlStr
	 * @return
	 */
	public String download(String urlStr){
		StringBuffer sb = new StringBuffer();
		String line = null;
		BufferedReader buffer = null;
		try{
			// 创建一个URL对象
			url = new URL(urlStr);
			// 创建一个Http连接
			HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();
			// 使用IO流读取数据
			buffer = new BufferedReader(new InputStreamReader(urlConn.getInputStream()));
			while((line = buffer.readLine()) != null){
				sb.append(line);
			}

		}catch(Exception e){
			e.printStackTrace();

		}finally{
			try{
				buffer.close();

			}catch(Exception e){
				e.printStackTrace();
			}
		}
		return sb.toString();
	}

	/**
	 * 该函数返回整形 -1:代表下载文件出错    0:代表下载文件成功     1:代表文件已经存在
	 */
	public int downFile(String urlStr, String path, String fileName){
		InputStream inputStream = null;
		try{
			FileUtils fileUtils = new FileUtils();
			if(fileUtils.isFileExist(path + fileName)){
				return 1;
			}else{
				inputStream = getInputStreamFromUrl(urlStr);
				File resultFile = fileUtils.write2SDFromInput(path, fileName, inputStream);
				if(resultFile == null){
					return -1;
				}
			}

		}catch(Exception e){
			e.printStackTrace();
			return -1;
		}finally{
			try{
				inputStream.close();
			}catch(Exception e){
				e.printStackTrace();
			}
		}

		return 0;
	}
	/**
	 * 根据URL得到输入流
	 *
	 * @param urlStr
	 * @return
	 * @throws MalformedURLException
	 * @throws IOException
	 */
	public InputStream getInputStreamFromUrl(String urlStr)
		throws MalformedURLException, IOException{
		url = new URL(urlStr);
		HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();
		InputStream inputStream = urlConn.getInputStream();
		return inputStream;
	}
}

结果示意图

刚开始下载不成功,一直输出-1,

后来百度、修改,终于输出0,下载成功,把程序调通~

时间: 2024-12-28 20:17:25

使用HTTP协议下载文件的相关文章

Linux下使用http协议下载文件

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <netdb.h> #include <sys/types.h> #include <arpa/inet.h> #include <sys/socket.h> //下载目标文件 : http://ftp.gnu.org/gnu/bc/bc-1.03.tar.gz #define HOST_

基于HTTP协议下载文件的实现

最近在开发文件下载的程序,该程序是基于HTTP开发的. 首先是了解了文件传输到客户端的大概格式,然后分析该格式,实现写入文件的功能. 自己构造的HTTP包如下: GET /*********.rar HTTP/1.1\r\n host:www.****.com\r\n connection:keep-alive\r\n\r\n 这个请求成功发出去了,而服务器的回应也是成功的,HTTP/1.1 200.................. 可惜的是,我的循环接收不争气,本来800KB左右的文件,只能

从网络上下载文件

文件的下载: 使用HTTP协议下载文件 ·创建一个HttpURLConnection对象 HttpURLConnection urlConnection=(HttpURLConnection)url.openConnection(); ·获得一个InputStream对象 urlConn.getInputStream() ·访问网络的权限 android.permission.INTERNET ·从网络上下载文件夹 HttpDownload.java中的代码: public class Http

Android利用Http下载文件

一.场景 下载存文本文件和下载如mp3等大容量的文件 界面 二.代码编写 1.AndroidMainfest.xml中配置 主要是解决网络权限和写SDCard的权限 Java代码   <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="li

android下载文件,文件包括视频以及各种文件

在做项目中要进行文件的下载以及调用系统软件打开,文件是服务端,以下是一些代码片段: 运用progressbar和http协议下载文件: 如果没有这个文件的就先进行创建并下载,如果有的话就打开: private void playMeida() { file2 = new File(savePAth + "/" + filename); if (!file2.exists()) { new Thread() { public void run() { try { down_file(pa

C#实现http协议支持上传下载文件的GET、POST请求

C#实现http协议支持上传下载文件的GET.POST请求using System; using System.Collections.Generic; using System.Text; using System.Net; using System.Net.Sockets; using System.Collections; using System.IO; using System.Text.RegularExpressions; using RE = System.Text.Regula

winform通过FTP协议上传下载文件

上传文件:窗体代码 一次上传多个文件(grdAffixFilesList中需要上传的) private Boolean UploadFile() { string filename; int upCount=0; for (int i = 0; i < this.grdAffixFilesList.Rows.Count; i++) { filename = this.grdAffixFilesList.Rows[i].Cells["FILEPATH"].Text.ToString

Linux上传下载文件

2种方式:xftp(工具).lrzsz xftp:协议--SFTP.端口号--22 lrzsz: rz,sz是Linux/Unix同Windows进行ZModem文件传输的命令行工具. 优点就是不用再开一个sftp工具登录上去上传下载文件. sz(下载):将选定的文件发送(send)到本地机器 rz(上传):运行该命令会弹出一个文件选择窗口,从本地选择文件上传到Linux服务器 安装命令:yum install lrzsz 从服务端发送文件到客户端:sz filename 从客户端上传文件到服务

java实现FTP下载文件

ftp上传下载文件,是遵照ftp协议上传下载文件的,本例仅以下载文件为例. 重要的方法解释: 1.FTP功能相关依赖路径:org.apache.commons.net.ftp.*: 2.ftp默认端口是21,如果非默认端口连接,需指定:ftp.connect(ftphostaddr, 22);//22为端口号 3.ftp.changeWorkingDirectory(ftppath) //实现切换目录 4.FTPFile[] fs = ftp.listFiles(); 获取指定目录下的文件列表