android ksoap 2でデータをアップロード、ダウンロード

8892 ワード

前にandroidと書いてありますが、ksoap 2パッケージを使用してリモートコールサービスを行う場合、サービスメソッドを呼び出すときにパラメータを渡す必要がある場合があります.ファイルをアップロードしたり、データをダウンロードしたりするときは?byte、byteはこのように定義されていることはよく知られています.byteはネットワークを通じて情報を伝送する単位で、ネットワーク上のすべての情報はbit単位で伝達され、1 bitは0または1を表し、8 bitは1 byteに等しいです.携帯電話のローカルデータを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の前にBase 64でregisterを行う必要があります.
new MarshalBase64().register(envelope);

Base 64ネットワーク上で最も一般的な8 Bitバイトコードを伝送するための符号化方式の1つであり、我々がデータ量が大きい場合、xmlのようなデータ型ファイルのように、Base 64符号化はHTTP環境下で長い識別情報を伝達するために使用することができる.Base 64符号化は、比較的短いだけでなく、符号化されたデータが肉眼で直接見られないという可読性も有する.Base 64の知識については、
http://baike.baidu.com/view/469071.htmに詳しく説明します.
前はアップロードデータで、次はダウンロードデータで、サービス側は圧縮後のxmlバイト配列に戻り、bodyIn後、転送されたbyte[]データが直接xmlと書くと文字化けしてしまいます.この場合、以下の操作が必要です.
一、Base 64の場合は、先に行う必要があります.
     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解析器が内蔵されています.
解析が完了すると、サービス側のデータを取得できます.