野人学Android第二弹——单张图片的上传

5 篇文章 0 订阅

上一篇博文中,我简单讲解了图片上传的基本原理,可能你还有点不懂,那么在本篇博文中,我会以具体的代码来阐述下Android是如何将图片上传到服务器的。

有两个难点需要解决:

1、Android端的HTTP的信息流的构建;‘

2、PHP服务器端的接收。


一、Android端的HTTP的信息流的构建

为了更好地理解数据上传的HTTP请求,我分成四个部分来介绍HTTP的数据请求。

第一,构建HTTP请求的基础信息

String boundary = "----WebKitFormBoundarySj2Wjtn2OCo0XNMl";
String prefix = "--";
String end = "\r\n";
URL httpurl=null;
StringBuffer sb=null;
<---------------上面是分隔符的声明----------------->
try {
<span style="white-space:pre">	</span>httpurl = new URL(params[0]);//获取url
	HttpURLConnection conn = (HttpURLConnection) httpurl.openConnection();//获取HttpURLConnection的实例		
	conn.setRequestMethod("POST");//设置为POST方法
	conn.setDoInput(true);//设置输入数据为真
	conn.setDoOutput(true);//设置输出数据为真
	conn.setRequestProperty("Content-Type", "multipart/form-data;boundary="+boundary);//设置内容的类型
			
}
关于HTTP的基础信息还有很多属性,如若大家有兴趣,可以自行百度。

第二,构建上传数据的信息

DataOutputStream out = new DataOutputStream(conn.getOutputStream());//实例数据输出流
out.writeBytes(prefix+boundary+end);//设置分隔符
out.writeBytes("Content-Disposition:form-data;"+"name=\"upfile"+i+"\";filename=\""+"workupload55555.jpg"+"\""+end);//设置上传的数据的参数
out.writeBytes("Content-Type: image/jpg" + end);//设置上传数据的类型
out.writeBytes(end);
FileInputStream fis = new FileInputStream(new File(fileName));
byte[] b = new byte[1024*4];
int len;
while((len=fis.read(b))!=-1){
	out.write(b,0,len);//将上传数据写入数据流
}
out.writeBytes(end);
Log.i("info", out.toString());
out.writeBytes(prefix+boundary+prefix+end);//设置终止符
out.flush();//输出流刷新

在Android端上传数据流到服务器之后,服务器会根据name(第三行)的值来接收输出流,filename则是要上传数据的文件名。以上只是单张照片上传的数据流的构建,至于批量照片的上传方法,下一篇博文中会介绍。

第三,接收服务器反馈信息

上传数据到服务器,不管上传是否成功,都要接收服务器的反馈信息。

BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
sb = new StringBuffer();
String str;
while ((str=reader.readLine())!=null) {
	sb.append(str);
}
System.out.println("response:"+sb.toString());
第四,关闭输入输出流

if(out!=null){
<span style="white-space:pre">	</span>out.close();
}
if(reader!=null){
	reader.close();
}

最后,不要忘了将输入输出流关闭,不能占着宝贵的内存。


二、PHP端服务器的接收

编写完Android端的代码,那么就要开始编写服务器端的接收代码了。刚开始的时候,我根部不知道服务器端如何识别Android端传来的数据,找了很多资料,并且尝试过才知道一个系统参数能实现——$_FILES。为了大家的记忆更加深刻,我们先来遍历一下$_FILES,看看有哪些参数。

foreach ($_FILES as $k=>$v){
	echo $k."==>".print_r($v)."||";
}

现在手机没电,就不展示遍历出来的信息了。到此为止,已经解决了单张图片上传的核心问题,剩下来的就是在服务器端处理上传的数据了,这里就不展示了。

需要再次强调的细节:

1、在Android端构建HTTP请求的时候,一定要在异线程中进行,不管是AsyncTask还是Thread中;

2、构建上传数据信息流的时候,将文件转化成输入流的时候,这个文件名是绝对地址;

3、在测试数据上传之前,要确认Android端和服务器端在同一个局域网中,不然会报错;


<-----------------------------------------分割线------------------------------>
写在最后:

上周末的时候,领导要提拔我做主管,但是当时已经决定进入IT界。这周,我已经投了四十几家公司,目前只有两家公司给了我面试的机会,我都已经做了安排。我不知道前面的路有多凶险,我也不知道程序员这条道路是不是适合我,但是这小半年的准备,让我感觉到编程能让我感到快乐。做现场品控,我感觉一点技术含量都没有,完全没有竞争力,一点挑战都没有。做程序员,至少还有一门技术在手,能开发个网站或者APP。加油!





  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值