继续上次的android上传文件携带参数POST提交

之前的文章实现了一个可以直接上传文件到服务器的例子,但是实际中很少有情况能直接上传服务器,换句话说都需要验证一下身份,成功登录才可以实现上传啊访问啊之类的功能,这次在PHP服务器端作了限制,这个限制就是对表单传来的数据进行一个验证,如何“admini”这个用户存在,则可以执行上传文件功能,如果不存在或者输入的用户不是admin,那么则拒绝操作。admin这个用户名放在 input 标签里,如:<input type = "tex"t,name="user",id="user"> 当点击提交时,这个input会获取输入的用户名参数,一起以POST方式提交给处理的PHP页面。(前提是这个表单以POST方式提交)。PHP页面通过$_POST['user']这个全局数组来根据【】内的指定的参数(例如user)来获取表单提交的变量。这里给出验证代码,在之前的一篇有全部代码,把这块代码加上就好了:


$username=$_POST['user'];    //通过POST全局数组获取到表单传递的参数并且放到变量$username中
echo $username; //打印变量验证是否获取到
if($username != "admin") //进行判断,若用户差传递参数为admin则可以上传文件,若不是admin则跳转到输入页面。
{
header("Location:up.php");
}

else

{

服务器上传文件代码。

}


服务器这端配置完毕,则对手机端进行调试,这次只是想传递一个参数,通过HTTP协议,看了网上很多例子,不知道发送参数的格式是什么,后来参考书上,下了一个HTTP协议分析工具,可以对访问的页面进行HTTP协议分析,即我们通过电脑可以输入用户名和文件路径成功上传后,通过这个fiddler2软件就可以分析出表单提交的数据格式,网上有很多很抽象,建议大家直接下一个自己来分析实际看一下就好。给出下载网站:http://www.telerik.com/fiddler 如不行的话访问: http://www.fiddler2.com/fiddler2/.  看一下有WIN8的还有WIN7的。自己选择可以合适的版本下载。

安装后运行界面,你直接在浏览器里访问一下上传文件的地址:例如我的:http://172.20.150.23/upload_file.php。访问后在软件左边选择这个upload_file.php 在右边选inspectors再选择raw。就可以看到全部协议内容:这里贴下我自己的:注意一定要下载英文版最新的,否则看不到这么详细的信息,亲测下了中文绿色的看不到。)



POST http://172.20.150.23/upload_file.php HTTP/1.1
Accept: image/jpeg, application/x-ms-application, image/gif, application/xaml+xml, image/pjpeg, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
Referer: http://172.20.150.23/up.php
Accept-Language: zh-CN
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; InfoPath.3; .NET4.0C; .NET4.0E)
Content-Type: multipart/form-data; boundary=---------------------------7df29a3920268
Accept-Encoding: gzip, deflate
Host: 172.20.150.23
Content-Length: 658
Connection: Keep-Alive
Pragma: no-cache
Cookie: PHPSESSID=6u8bk8lbvgs9blns54795pm047 

// /以上部分为请求头部分,没有太大问题,着重看下边格式。


-----------------------------7df29a3920268 //这里是分割线要有--开头,后边的数字为随机函数生成的。 
Content-Disposition: form-data; name="file1"; filename="˵  .txt" //这里说明要上传的类型是form-data类型,标出input 文件域的标签名称,还有上传文件的名字
Content-Type: text/plain //这一行是文件内容
//空格
//空格
 ޸    show recorderlist 628         "VMLOAD" //开始写正文即上传文件
650     ȡֵ$title  6  .$66[6]
     ж                  ġ    ģ  Ϊ գ   Ϊ           
refresh_out_crilist 36-42   ӱ ͷ      refresh_outvmload    
 ޸   cloudosmanager.js  ߵ    ӵ  ú   17654 refresh_outvmload //写完后加一个回车换行
-----------------------------7df29a3920268 //传递额外的参数,先写分割线,再写一个回车换行(\r\n)
Content-Disposition: form-data; name="user" //原样写入左边内容,写一个回车换行(\r\n)
//空行
//空行
sda //写入要填写的用户名字,再写一个回车换行。说明:这篇文章里的回车换行都是将光标移动到下一行左端开始处
-----------------------------7df29a3920268 /*  注释之间的内容是另外参数的传递格式同上
Content-Disposition: form-data; name="submit"


 ύ */
-----------------------------7df29a3920268-- //写完参数后,再写一个回车换行,把分割线再写进来。最后再写一个回车换行就可以了。


android端主要是模拟表单提交,所以向服务器发送的信息都要严格遵循格式,否则服务器接收不到,这也是困扰我这么多天的难点。直接分析我这个上传文件的HTTP请求:

请求头那些就不说,大概都差不多,分析见上边注释,下面用代码来对照说明:

先对照上传文件内容:

-----------------------------7df29a3920268
Content-Disposition: form-data; name="file1"; filename="˵  .txt"
Content-Type: text/plain


 ޸    show recorderlist 628         "VMLOAD"
650     ȡֵ$title  6  .$66[6]
     ж                  ġ    ģ  Ϊ գ   Ϊ           
refresh_out_crilist 36-42   ӱ ͷ      refresh_outvmload    
 ޸   cloudosmanager.js  ߵ    ӵ  ú   17654 refresh_outvmload
-----------------------------7df29a3920268

代码:

StringBuilder sb1 = new StringBuilder();
sb1.append(PREFIX);       //写下分割线
sb1.append(BOUNDARY);
sb1.append(LINEND);         //分割结束后 回车换行
sb1.append("Content-Disposition: form-data;name=\"file1\"; filename=" + FileName + LINEND);//写上传类型参数后回车换行
sb1.append("Content-Type: application/octet-stream; charset="+ CHARSET + LINEND);//写上传文本内容回车换行
sb1.append(LINEND);//可以看到头部和正文之间有空行,在写一个回车换行



outstream.write(sb1.toString().getBytes()); //头部数据写入

InputStream is = new FileInputStream(FileName); 
byte[] buffer = new byte[1024];
int len = 0;
while((len=is.read(buffer))!=-1)  //正文写入

{
System.out.println(len);
Log.v("len","keb");
outstream.write(buffer,0,len);
}
is.close();
outstream.write(LINEND.getBytes()); //写完后还要再写一个回车换行等待下一个变量输入

传递额外的参数:

-----------------------------7df29a3920268
Content-Disposition: form-data; name="user"


sda
-----------------------------7df29a3920268

代码:

StringBuilder sb2 = new StringBuilder();
sb2.append(PREFIX);   
sb2.append(BOUNDARY);
sb2.append(LINEND);
sb2.append("Content-Disposition: form-data;name=\"user\"");
sb2.append(LINEND);  //实现空行处理
sb2.append(LINEND);
sb2.append(username);//写输入据
sb2.append(LINEND);//回车换行
sb2.append(PREFIX);//写分割线
sb2.append(BOUNDARY);
outstream.write(sb2.toString().getBytes());//提交数据
outstream.write(LINEND.getBytes());//提交一个回车换行



至此可以成功上传参数,大家可以根据需要,设置session等,保持回话之类功能,只要参数可以上传成功就没问题了!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值