Android实现简单的文件上传

配置说明

通信协议

  • 我们约定,在提交数据时,变量file是上传文件的数据流,变量fname是上传文件的名称。
  • 如果一次上传多个文件则可以约定,变量file0file1file2…是上传文件的数据流,变量fname0fname1fname2…是上传文件的名称,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

以上

本文如果错误之处还望不吝赐教,批评指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值