Android文件上传下载

Android要实现文件上传,可以利用Socket上传,也可以模拟Web进行上传,但是如果是使用第一种方式上传,严格的话就得使用TCP,这样容易生成系统死掉,或者是长时间等待,如果是UDP来传,就容易造成数据丢失,因此在这里选择了Web进行上传,使用Web进行上传是模拟的Http Post上传数据,当然,Post上传数据的类,在网上找了一找,方式虽然很多,但是没有一个感觉是我所使用的,所以参照原理之类的,进行了一下修改,算是做了一个参考。并且利用这个类完成了文件和表彰的上传服务。

上传:

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Map;

public class PostFile {
	// 上传代码,第一个参数,为要使用的URL,第二个参数,为表单内容,第三个参数为要上传的文件,可以上传多个文件,这根据需要页定
	public static String post(String actionUrl, Map<String, String> params,
			Map<String, File> files) throws IOException {
		String BOUNDARY = java.util.UUID.randomUUID().toString();
		String PREFIX = "--", LINEND = "\r\n";
		String MULTIPART_FROM_DATA = "multipart/form-data";
		String CHARSET = "UTF-8";
		URL uri = new URL(actionUrl);
		HttpURLConnection conn = (HttpURLConnection) uri.openConnection();
		conn.setReadTimeout(5 * 1000);
		conn.setDoInput(true);// 允许输入
		conn.setDoOutput(true);// 允许输出
		conn.setUseCaches(false);
		conn.setRequestMethod("POST"); // Post方式
		conn.setRequestProperty("connection", "keep-alive");
		conn.setRequestProperty("Charsert", "UTF-8");
		conn.setRequestProperty("Content-Type", MULTIPART_FROM_DATA
				+ ";boundary=" + BOUNDARY);
		// 首先组拼文本类型的参数
		StringBuilder sb = new StringBuilder();
		for (Map.Entry<String, String> entry : params.entrySet()) {
			sb.append(PREFIX);
			sb.append(BOUNDARY);
			sb.append(LINEND);
			sb.append("Content-Disposition: form-data; name=\""
					+ entry.getKey() + "\"" + LINEND);
			sb.append("Content-Type: text/plain; charset=" + CHARSET + LINEND);
			sb.append("Content-Transfer-Encoding: 8bit" + LINEND);
			sb.append(LINEND);
			sb.append(entry.getValue());
			sb.append(LINEND);
		}
		DataOutputStream outStream = new DataOutputStream(
				conn.getOutputStream());
		outStream.write(sb.toString().getBytes());
		// 发送文件数据
		if (files != null)
			for (Map.Entry<String, File> file : files.entrySet()) {
				StringBuilder sb1 = new StringBuilder();
				sb1.append(PREFIX);
				sb1.append(BOUNDARY);
				sb1.append(LINEND);
				sb1.append("Content-Disposition: form-data; name=\"file\"; filename=\""
						+ file.getKey() + "\"" + LINEND);
				sb1.append("Content-Type: application/octet-stream; charset="
						+ CHARSET + LINEND);
				sb1.append(LINEND);
				outStream.write(sb1.toString().getBytes());
				InputStream is = new FileInputStream(file.getValue());
				byte[] buffer = new byte[1024];
				int len = 0;
				while ((len = is.read(buffer)) != -1) {
					outStream.write(buffer, 0, len);
				}
				is.close();
				outStream.write(LINEND.getBytes());
			}
		// 请求结束标志
		byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINEND).getBytes();
		outStream.write(end_data);
		outStream.flush();
		// 得到响应码
		int res = conn.getResponseCode();
		InputStream in = conn.getInputStream();
		InputStreamReader isReader = new InputStreamReader(in);
		BufferedReader bufReader = new BufferedReader(isReader);
		String line = null;
		String data = "OK";
		while ((line = bufReader.readLine()) == null)
			data += line;
		if (res == 200) {
			int ch;
			StringBuilder sb2 = new StringBuilder();
			while ((ch = in.read()) != -1) {
				sb2.append((char) ch);
			}
		}
		outStream.close();
		conn.disconnect();
		return in.toString();
	}
}

以上如果要写入(上传)数据,这里使用的是out.write亦可使用out.wrtebyte(content)这样子也可以,省得在这里转换了,交给系统进行转换

这个可以根据个人的需要,加上等待条等等,如果要加上等待条的话,需要使用发送消息的方式进行,这个是我所想到的,其它的方式没有考虑好呢,有兴趣的人可以自己加上去!我在这里不再给增加了,增加的话,将在下载中添加一个下载的进度提示条。

Button btn1;
	 
	 EditText view1;  
	 EditText text1;    
	 String SDPath = "/sdcard/";    
	 /** Called when the activity is first created. */   
	 @Override    
	 public void onCreate(Bundle savedInstanceState) {       
		 super.onCreate(savedInstanceState);       
		 setContentView(R.layout.main);       
		 view1 = (EditText) findViewById(R.id.view1);   
		 text1 = (EditText) findViewById(R.id.edit1);      
		 btn1 = (Button) findViewById(R.id.btn1);     
		 btn1.setOnClickListener(new View.OnClickListener() {     
			 @Override            
			 public void onClick(View v) {   
				 // TODO Auto-generated method stub   
				 getFile();             
				 try {                   
					 String name=URLEncoder.encode(text1.getText().toString(),"utf-8");
					 Map<String, String> params = new HashMap<String, String>();     
					 params.put("NAME", name);      
					 Map<String, File> files = new HashMap<String, File>(); 
					 files.put(getFile(), new File("/sdcard/"+getFile()));  
					 view1.setText(PostFile.post("http://wdsl.recordinfo.tk/default.aspx", params, files));
					 } catch (Exception e) {  
						 // TODO Auto-generated catch block      
						 e.printStackTrace();         
						 }            }      
			 });    }   
	 String getFile() {       
		 File file = new File(SDPath);  
		 File[] files = file.listFiles(new fileFilter());   
		 String filename = "";     
		 for (File file1 : files) {      
			 filename = file1.getName();    
		 }        
		    Toast.makeText(this, filename, Toast.LENGTH_LONG).show(); 
		 return filename;    
		 }   
	 
	     class fileFilter implements FilenameFilter {  
		 @Override        
		 public boolean accept(File dir, String filename) { 
			 // TODO Auto-generated method stub   
			 return filename.endsWith(".gif");  
			 }   
		 }
				 }
			 }
			 
		 }
	 }

下载:


public void downFile(String url, String path, String fileName)throws IOException {
	if (fileName == null || fileName == "")    
		this.FileName = url.substring(url.lastIndexOf("/") + 1);
	else 
		this.FileName = fileName; // 取得文件名,如果输入新文件名,则使用新文件名      
	URL Url = new URL(url);  
	URLConnection conn = Url.openConnection();     
	conn.connect();        
	InputStream is = conn.getInputStream(); 
	this.fileSize = conn.getContentLength();// 根据响应获取文件大小 
	if (this.fileSize <= 0) {  
		// 获取内容长度为0         
		throw new RuntimeException("无法获知文件大小 ");     
		}        
	if (is == null) {  
		// 没有下载流         
		sendMsg(Down_ERROR);   
		throw new RuntimeException("无法获取文件");    
		}       
	FileOutputStream FOS = new FileOutputStream(path + this.FileName);
	// 创建写入文件内存流,通过此流向目标写文件      
	byte buf[] = new byte[1024];       
	downLoadFilePosition = 0;      
	int numread;       
	while ((numread = is.read(buf)) != -1) { 
		FOS.write(buf, 0, numread);     
		downLoadFilePosition += numread   
		}               
	try {        
		is.close();   
		} catch (Exception ex) { 
			;   
			}   
		}
	}
}

通过此代码就可以实现将内容保存到SD卡等设备上,当然要使用网络,必须得有网络的访问权限。这个需要自己添加,在这里不再添加!

 

上面的代码没有实现进度条功能,如果要实现进度条功能,我现在考虑到的就是使用消息进行发送提示,首先实现一个消息。


private Handler downloadHandler = new Handler() { 
	// 用于接收消息,处理进度条        
	@Override        
	public void handleMessage(Message msg) { 
		// 接收到的消息,并且对接收到的消息进行处理   
		if (!Thread.currentThread().isInterrupted()) {
			switch (msg.what) {              
			case DOWN_START:                
				pb.setMax(fileSize); //设置开始长度               
			case DOWN_POSITION:                   
				pb.setProgress(downLoadFilePosition);
				// 设置进度                  
				break;                
			case DOWN_COMPLETE:       
				Toast.makeText(DownLoadFileTest.this, "下载完成!", 1).show();  // 完成提示         
				break;          
			case Down_ERROR:  
				String error = msg.getData().getString("下载出错!");  
				Toast.makeText(DownLoadFileTest.this, error, 1).show();   
				break;           
			 }          
			}           
		super.handleMessage(msg);             
		}   
	}; 

原文地址:http://www.cnblogs.com/fly_binbin/archive/2010/12/19/1910360.html
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值