zoukankan      html  css  js  c++  java
  • 用android ksoap2 上传、下载数据

         在前面已经写了android如果使用ksoap2包来进行远程调用服务,调用服务方法的时候有时候需要传递参数,传递一些基本类型参数到没什么,如果在上传文件或下载数据的时候呢?大家都知道byte,byte是这样定义的,byte是通过网络传输信息的单位,网络上所有的信息都是以bit为单位传递的,一个bit代表一个0或1,8个bit等于1byte。当我们需要将手机本地的数据经过xml文件上传到服务端的时候,就需要把xml文件转换成byte才能成功上传。

      下面是代码以及过程:

    首先要将文件转换成InputStream,本人在这里进行了文件压缩:

     1 // 对文件进行压缩
     2     public static byte[] compressToByte(File file) {
     3         try {
     4             InputStream inputStream = new FileInputStream(file);
     5             ByteArrayOutputStream out = new ByteArrayOutputStream();
     6             GZIPOutputStream gzip = new GZIPOutputStream(out);
     7             byte[] bytes = new byte[1024];
     8             int count = 0;
     9             while ((count = inputStream.read(bytes)) > -1) {
    10                 gzip.write(bytes, 0, count);
    11             }
    12             gzip.finish();
    13             gzip.close();
    14             inputStream.close();
    15             return out.toByteArray();
    16         } catch (Exception e) {
    17             // TODO: handle exception
    18             e.getStackTrace();
    19         }
    20         return null;
    21     }

    压缩以后 返回的是byte[],服务端的参数类型也是byte[] ,目前转换成biye[]数组,以为就直接可以这样写就可以上传了么!

    soapObject.addProperty("bytes", bytes);

    这样上传是不成功的,我们需要在call之前用Base64进行register.

    new MarshalBase64().register(envelope);

    Base64网络上最常见的用于传输8Bit字节码的编码方式之一,当我们上传数据量很大的时候,像xml这种数据型文件,Base64编码可用于在HTTP环境下传递较长的标识信息。采用Base64编码不仅比较简短,同时也具有不可读性,即所编码的数据不会被人用肉眼所直接看到。关于Base64的知识,请到

    http://baike.baidu.com/view/469071.htm去详细了解。

    前面是上传数据,接下来是下载数据,服务端传回压缩后的xml字节数组,在bodyIn后,传回来的byte[]数据直接写成xml的话是乱码,这时需要以下操作:

    一、如果是Base64需要先进行:

         byte[] bytes=Base64.decode(resulObject.getProperty(0).toString());

    二、由于该文件是zip压缩文件的byte,需要对其写成zip文件

    //把获取到的字节流写入zip文件
              File files=new File(activity.getFilesDir(), "huirongassets.zip");
              FileOutputStream fs=new FileOutputStream(files);
              fs.write(bytes, 0, bytes.length);
              fs.flush();
              fs.close();

    三、对该zip文件进行解压:

     1  public byte[] unGZip(InputStream inputStream){
     2          byte[] b=null;
     3          try {
     4             //Gzip输入流
     5              GZIPInputStream gzip=new GZIPInputStream(inputStream);
     6             byte[] bytes=new byte[31240];
     7             int num=-1;
     8             ByteArrayOutputStream baos=new ByteArrayOutputStream();
     9             while((num=gzip.read(bytes,0,bytes.length))>-1){
    10                 baos.write(bytes, 0, num);
    11             }
    12             b=baos.toByteArray();
    13             baos.flush();
    14             baos.close();
    15             gzip.close();
    16             return b;
    17          } catch (Exception e) {
    18             // TODO: handle exception
    19             e.getStackTrace();
    20         }
    21          return null;
    22      }

    四、解压后返回解压后的字节数组 这时候byte[]是xml文件了:

    1 File file=new File(activity.getFilesDir(), "dataversion.xml");
    2          FileOutputStream outputStream=new FileOutputStream(file);
    3          outputStream.write(bytes, 0, bytes.length);
    4          outputStream.flush();
    5          outputStream.close();

    五、最后用xml解析器解析,关于解析器会后面再详细记录。android内嵌了pull解析器,java中还有SAX解析器,DOC解析器。

    解析完毕后就可以获取服务端的数据了。

  • 相关阅读:
    Exchange 2013与 Office Web Apps 整合
    SharePoint2013 以其他用户登录和修改AD域用户密码 功能
    sharepoint 2010 自定义页面布局
    sharepoint 2010 记录管理 对象模型
    SharePoint2010 对象模型 关联列表
    在SharePoint Server 2010中更改“我的网站”
    xenapp 6.5 客户端插件第一次安装总是跳到官网
    如何解决在Windows Server 2008 R2 上安装证书服务重启后出现 CertificationAuthority 91错误事件
    在Win7 Hyper-v虚拟机中挂接真实机的声卡
    win8 中如何删除 共享文件夹 用户名和密码
  • 原文地址:https://www.cnblogs.com/JunXiao/p/2674820.html
Copyright © 2011-2022 走看看