android上传单个或多个文件

这篇文章会对HttpUrlConnection类的用法做一个概述,然后着重学习和尝试了上传单个文件和多个文件到服务器,服务器使用了php脚本接受上传的文件,当接受成功后它会返回一些信息给手机端,手机端简单的在TextView中显示这些信息。上传的文件放在了assets目录下,这样就可以使用AssetManager类对这些文件方便的进行读取。为了完成这个项目,我搭建了apache服务器,并首先使用html中的表单元素上传文件,对php脚本接受文件的代码做了测试,这些都在文章中有所交代。之后,为了更好的配置H
摘要由CSDN通过智能技术生成

1.HttpUrlConnection类概述

HttpUrlConnection是一个HTTP协议的UrlConnection,用于通过web收发数据。数据可以是任意类型和长度。这个类主要用于收发提前不知长度的数据流。

这个类的用法遵循以下模式:

  1. 首先获得一个HttpUrlConnection的实例。通过调用URL类中的openConnection()函数。并做强制类型转换。
  2. 准备请求。请求的基本属性是一个URL,请求头可能包含一些元数据,比如:证书, 首选的内容类型,session和cookie等。
  3. 可选的上传一个请求体。HttpUrlConnection的实例如果包含一个请求体的话,必须使用setDoOutput(true)函数设置一下。然后可以通过getOutPutStream获得一个输出流,向流中写入数据即可传输数据。
  4. 读响应。典型响应头包含着这样一些元数据,比如:1.响应体的内容类型和长度,2.修改的日期,3.session和cookie等。响应体可以从getInputStream()返回的流中读取。如果响应没有响应体,getInputStream()返回为空。
  5. 断开连接。一旦响应体被读取,HttpUrlConnection应该通过调用disconnect()方法来关闭。这个关闭会释放这个连接所持有的资源。
根据上述要求,初步写如下实验程序,这个程序的功能就是向服务器发送一个请求,并获得服务器的响应,把这些响应显示在一个TextView中。
<span style="font-family:SimSun;font-size:14px;">public class MainActivity extends AppCompatActivity {
    URL url = null;
    TextView textView;
    Handler handler;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = (TextView) findViewById(R.id.text);
        Log.d("hello","oncreate");
        handler = new Handler(new Handler.Callback() {
            @Override
            public boolean handleMessage(Message msg) {
                Log.d("hello",msg.getData().getString("name"));
                textView.setText(msg.getData().getString("name"));
                return true;
            }
        });
        new Thread(new Runnable() {
            HttpURLConnection connection;
            @Override
            public void run() {
                try {
                    url = new URL("https://www.baidu.com/?tn=57095150_1_oem_dg");
                    connection = (HttpURLConnection) url.openConnection();
                    InputStream in = new BufferedInputStream(connection.getInputStream());
                    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(in));
                    StringBuilder stringBuilder = new StringBuilder();
                    String line;
                    while ((line=bufferedReader.readLine())!=null){
                        stringBuilder.append(line);
                    }
                    Message message = new Message();
                    Bundle bundle= new Bundle();
                    bundle.putString("name",stringBuilder.toString());
                    message.setData(bundle);
                    handler.sendMessage(message);
                } catch (MalformedURLException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }finally {
                    connection.disconnect();
                }
            }
        }).start();
    }
}</span>
这段代码访问https://www.baidu.com/?tn=57095150_1_oem_dg页面,并把获得的内容放到Textview中显示。需要注意的几点:
  1. Android的Ui线程不可以访问网络等耗时的工作,所以这里将其放在一个子线程中。
  2. TextView一页可能显示不完,最好把TextView放到一个ScrollView中,这样就可以向下滚动查看所有内容了。
  3. 使用Handler和Message更新UI.
  4. 不要忘记添加网络访问权限:
    <uses-permission android:name="android.permission.INTERNET"></uses-permission>

1.2.基于HTTPS安全连接

首先也是使用openConnection()方法获得一个HttpsURLConnection实例。这个URL当然是使用“https://”开头的URL.它允许覆写
HostnameVerifierSSLSocketFactory接口。一个支持SSLSocketFactory的应用程序可以提供一个自定义的X509TrustManager,
用于证书链的验证,并且一个自定义的X509KeyManager用于客户端的验证。

1.3.发送内容

为了上传数据到服务器,配置连接为输出,使用setDoOutput(true)
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值