android原生POST、httpClient4.X实现向PHP服务器上传文件

前言:虽然网上代码一堆,相对减轻了尝试的复杂程度,但真正运行起来还是有各种问题的,没有源码直接运行是一个很大问题,我尝试了一天之后,终于弄懂了些门路,分享给大家,对于原生POST方式上传,因为我也不会用这种方式上传文件,效率低,不好用,所以我也没有深究具体代码及原理,但我给出的代码是可行的,我们先从PHP在浏览器中上传图片到服务器开始,然后逐步讲解通过android是如何上传的,android的那些参数该如何构造。

一、通过网页上传图片到PHP服务器

具体讲解参考我这篇文章《不刷新实现图片上传功能》,里面源码啥啥的都有,下面我只贴出前后台部分代码,讲解一个问题

前台部分代码:

<div id="upLoad">
	<div id="processing" style="font-size:10px;"></div>
	<form action="post2.php" method="post" enctype="multipart/form-data" target="form-target" οnsubmit="startUpload();">
		<tr>
			<td><span>上传到图库</span></td>
			<td><input type='file' name='upfile' id='file' style='margin-left:10px'/></td>
			<td><input type="submit" value="上传" style="margin-left:25px;padding-left:5px;padding-right:5px;"/></td>
		</tr>
	</form>
<iframe style="width:0; height:0; border:0;" name="form-target"></iframe>
</div>

注意一个input控件type='file',name='upfile'

后台部分代码

$filePath="temp/";
if (!file_exists($filePath)){//如果指定文件夹不存在,则创建文件夹
            mkdir($filePath , 0777);
     }
//重新定义文件路径及文件名
//分离文件路径,分离结果为:pathinfo() 返回一个关联数组包含有 path 的信息。包括以下的数组单元:dirname,basename 和 extension。
$houzhui = pathinfo($_FILES['upfile']['name']);
//判断格式是否是图片格式
if ( !in_array($houzhui['extension'],array('jpg','gif','png','JPG','GIF','PNG')) ) {
	$result=2;
}else{
	$name=$filePath."newName".'.'.$houzhui['extension'];
	//移动上传的临时文件,为新的文件
	//如果移动成功,输出相应内容
	if(move_uploaded_file($_FILES['upfile']['tmp_name'],$name))
	{
		$result=0;
	}
	//如果移动失败
	else{
		$result=-1;
	}
}

这里注意一个变量:$_FILES['upfile']['name'],$_FILES的第一个参数是upfile,表示就是接收我们上面定义的 <input type='file' name='upfile'/>,所传上来的文件
我想讲的是:在PHP里的$_FILES的第一个参数的名字,要与HTML里input标签的name属性的值一样

二、android原生POST上传文件

基本用不到,不细讲了,直接看源码吧(源码在最后)

三、httpClient 4.X实现向PHP服务器上传文件

上效果图:

android端:

/* 上传文件至Server,uploadUrl:接收文件的处理页面 */
private void uploadFile(String uploadUrl) throws Exception
{
		HttpClient httpclient = new DefaultHttpClient();
		httpclient.getParams().setParameter(
				CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
		HttpPost httppost = new HttpPost(uploadUrl);
		
		MultipartEntity entity = new MultipartEntity();
		
		File file = new File(srcPath);
		FileBody fileBody = new FileBody(file);
		entity.addPart("uploadedfile", fileBody);
			
		httppost.setEntity(entity);
		HttpResponse response = httpclient.execute(httppost);
		
		HttpEntity resEntity = response.getEntity();
		if (resEntity != null) {			
			Toast.makeText(this, EntityUtils.toString(resEntity), Toast.LENGTH_LONG).show();
		}

		httpclient.getConnectionManager().shutdown();

}
这里注意一下这小段代码:
MultipartEntity entity = new MultipartEntity();		
File file = new File(srcPath);
FileBody fileBody = new FileBody(file);
entity.addPart("uploadedfile", fileBody);		
httppost.setEntity(entity);

1、由于httpClient是模拟Form表单的,所以它肯定也有相当于form表单中input type='file'的元素,而FileBody就是对应的input type='file'的标签的;

2、下句:entity.addPart("uploadedfile", fileBody);这句,把我们的fileBody加入到表单中,而前面的uploadedfile就相当于input type=file name='xxx'的name字段的值,这就是为什么在PHP接收中,$_FILES['uploadedfile']['name'],这个$_FILES第一个参数要与entity.addPart("uploadedfile", fileBody);的第一个参数一样的原因;

看服务器端(PHP):

<?php
$target_path  = "./upload/";//接收文件目录
$target_path = $target_path . basename( $_FILES['uploadedfile']['name']);
if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) {
   echo "The file ".  basename( $_FILES['uploadedfile']['name']). " has been uploaded";
}  else{
   echo "There was an error uploading the file, please try again!" . $_FILES['uploadedfile']['error'];
}

难度不大,只注意一点:$_FILES['uploadedfile']['tmp_name']的第一个参数要与android代码中的entity.addPart("uploadedfile", fileBody);第一个参数名保持一致;
在源码中,这对这种方法稍微进行了扩充,同时上传两个图片到PHP服务器;


上源码啦:http://download.csdn.net/detail/harvic880925/6769671(不要分,仅供分享)

实例运行方法:

1、使用真机测试,使服务器与真机处于同一局域网中;
2、将Desert.jpg和1.jpg复制到手机sdcard根目录下,即Desert.jpg所处的位置为:sdcard/Desert.jpg和sdcard/1.jpg;
3、将receive_file.php,放在Apache服务器htdocs目录下;
4、将android代码中的:222.195.151.19,改成自己电脑PHP服务器的地址;


转载请标明出处,谢谢:http://blog.csdn.net/harvic880925/article/details/17565481

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
要使用 HttpClient.GetAsync 方法获取 Windows Server 2016 服务器上的文件,您需要按照以下步骤进行操作: 1. 在您的 C# 代码中,创建一个 HttpClient 实例,以便您可以使用其中的 GetAsync 方法来发送 GET 请求并获取文件。 2. 在 GetAsync 方法中,传递文件的 URL,以便 HttpClient 可以按照您的请求从服务器上获取该文件。例如:`var response = await httpClient.GetAsync("http://yourserver.com/yourfile.txt");` 3. 您可以使用 response.Content 属性来检索服务器响应的内容,例如:`var content = await response.Content.ReadAsStringAsync();` 4. 最后,您可以在代码中处理文件的内容,或者将其保存到本地计算机上以供后续使用。 关于服务器的配置,您需要确保您的 Windows Server 2016 服务器已经安装了 Internet Information Services (IIS)。然后,您需要在 IIS 中配置一个网站,以便您可以将文件放置在该网站下,并且可以使用 HttpClient.GetAsync 方法按照 URL 访问它。 具体而言,您需要按照以下步骤进行配置: 1. 打开 IIS 管理器,并在左侧的“连接”窗格中选择您的服务器。 2. 右键单击“网站”节点,并选择“添加网站”。 3. 按照向导中的提示,为您的网站指定名称、物理路径和端口号等信息。 4. 将您要获取的文件放置在网站的根目录下或子目录中。 5. 确保您的服务器防火墙已将所选端口打开,以便外部计算机可以访问您的网站。 6. 使用 HttpClient.GetAsync 方法并传递您的文件的 URL,以按照 HTTP 协议从您的服务器上获取该文件。 请注意,服务器配置的具体步骤可能因您的环境而异,因此您可能需要参考更详细的文档或向您的 IT 部门寻求支持。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值