配置说明
- 服务器端使用PHP脚本语言
- 移动端使用第三方库:httpmime-4.1.1.jar
- jar包下载地址:http://download.csdn.net/detail/shikangkai/9335825
通信协议
- 我们约定,在提交数据时,变量
file
是上传文件的数据流,变量fname
是上传文件的名称。 - 如果一次上传多个文件则可以约定,变量
file0
,file1
,file2
…是上传文件的数据流,变量fname0
,fname1
,fname2
…是上传文件的名称,fcount
是上传文件的总数(用于遍历所有的文件流和文件名称)。 - 变量名字符串的拼接java中使用
+
,php使用.
连接
客户端操作
S1. 定义需要的类成员变量
HttpClient httpClient; //执行网络请求的对象
HttpPost post; //网络请求对象
MultipartEntity multipartEntity; //请求的参数部分
String url; //网络请求的地址
S2. 变量的初始化操作
url = '自定义的链接地址';
post = new HttpPost(url);
multipartEntity = new MultipartEntity();
HttpParams httpParams = new BasicHttpParams();
//NetConfig.TIMEOUT为自定义常量,用于设置连接超时时长
HttpConnectionParams.setConnectionTimeout(httpParams, NetConfig.TIMEOUT);
httpClient = new DefaultHttpClient(httpParams);
S3. 添加请求参数
情况一:字符串
try {
//keyString和valueString为自定义的字符串内容,分别表示参数名和参数值
multipartEntity.addPart(keyString, new StringBody(valueString, Charset.forName("utf-8")));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
情况二:文件流
try {
//其中变量声明为:String fname; File file;
//在只有一个上传文件时,我们定义fname="file";
multipartEntity.addPart(fname, new FileBody(file));
/*
当有多个上传文件时:
如变量声明为String[] fnames;File[] files;
for (int i = 0; i < fnames.length; i++) {
multipartEntity.addPart("file" + i, new FileBody(files[i]));
multipartEntity.addPart("fname" + i, new StringBody(fnames[i], Charset.forName("utf-8")));
}
multipartEntity.addPart("fcount", new StringBody("" + fnames.length, Charset.forName("utf-8")));
*/
} catch (Exception e) {
e.printStackTrace();
}
S4. 执行网络请求,获取返回结果
post.setEntity(multipartEntity);
HttpResponse response = httpClient.execute(post);
/**
* 通过response.getEntity().getContent()可以获得网络返回内容(如果有的话)的输入流对象(InputStream)
* 如果我们的服务器端对文件上传的结果返回的是JSON格式的字符串的时候,可以通过输入流先把内容转换为JSONObject,然后再解析JSONObject的内容判断上传是否成功
*/
PS: Android中不允许在主线程中进行网络等耗时的操作,即上述的
httpClient.execute(post)
部分,若要解决这一问题可以使用Thread
或者AsyncTask
等
S5. 在工程的AndroidManifest.xml
文件中添加访问网络的权限
<uses-permission android:name="android.permission.INTERNET"/>
服务器端操作
情况一:单个上传文件的情况
<?php
if (UPLOAD_ERR_OK == $_FILES['file']['err']) {
copy($_FILES['file']['tmp_name'], "upload/" . @$_REQUEST['fname']);
$obj->code = 0;
$obj->desc = urlencode("上传成功");
} else {
$obj->code = 1;
$obj->desc = urlencode("上传失败");
}
echo urldecode(json_encode($obj));
?>
情况二:多个上传文件的情况
<?php
$obj->code = 0;
$obj->desc = urlencode("上传成功");
for ($i = 0; $i < @$_REQUEST['fcount']; $i++) {
if (UPLOAD_ERR_OK == $_FILES['file' . $i]['err']) {
copy($_FILES['file' . $i]['tmp_name'], "upload/" . @$_REQUEST['fname' . $i]);
} else {
$obj->code = 1;
$obj->desc = urlencode("上传失败");
break;
}
}
echo urldecode(json_encode($obj));
?>
PS
Apache HttpClient Mime的API参考地址:
http://hc.apache.org/httpcomponents-client-ga/httpmime/apidocs/index.html
以上
本文如果错误之处还望不吝赐教,批评指正。