歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Android通過Base64往服務器上傳圖片和對象

點擊這裡在下載Base64.java文件,分別添加到客戶端和服務器端.

1>我們知道在web中實現文件上傳可以通過apache的項目,那麼在Android中把文件上傳到服務器端,當然也可以通過該方式,但是也可以通過base64,

這樣就相當於把一個字符串傳到服務器,然後在服務器端通過Base64.decode()方法解碼接口,返回的字節數組byte[]

在android side:

  1. public class MainActivity extends Activity {  
  2.     InputStream is = null;  
  3.    
  4.     @Override  
  5.     public void onCreate(Bundle icicle) {  
  6.    
  7.         super.onCreate(icicle);  
  8.    
  9.         setContentView(R.layout.main);  
  10.    
  11.         Bitmap bitmapOrg = BitmapFactory.decodeResource(getResources(),  
  12.    
  13.         R.drawable.a1);  
  14.    
  15.         ByteArrayOutputStream bao = new ByteArrayOutputStream();  
  16.    
  17.         bitmapOrg.compress(Bitmap.CompressFormat.PNG, 90, bao);  
  18.    
  19.         byte[] ba = bao.toByteArray();  
  20.    
  21.         String ba1 = Base64.encodeBytes(ba);  
  22.    
  23.         ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();  
  24.    
  25.         nameValuePairs.add(new BasicNameValuePair("image", ba1));  
  26.    
  27.         try {  
  28.    
  29.             HttpClient httpclient = new DefaultHttpClient();  
  30.    
  31.             HttpPost httppost = new  
  32.    
  33.             HttpPost(  
  34.                     "http://192.168.0.101:8080/ServletClassloadTest/servlet/UploadImage");  
  35.    
  36.             httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));  
  37.    
  38.             HttpResponse response = httpclient.execute(httppost);  
  39.    
  40.             HttpEntity entity = response.getEntity();  
  41.    
  42.             is = entity.getContent();  
  43.    
  44.         } catch (Exception e) {  
  45.    
  46.             Log.e("log_tag""Error in http connection " + e.toString());  
  47.    
  48.         }  
  49.    
  50.     }  
  51. }

在server side:

  1.         String result = request.getParameter("image")          
  2.         byte[] result = Base64.decode()  
  3.         OutputStream out = new FileOutputStream("C:\\a.png");  
  4.         out.write(result);  
  5.         out.close();

測試結果:在C盤找到如下文件

2>同理我們也可以在客戶端把對象傳遞到服務器端.(這是把多個對象傳遞給服務器端,傳遞單個對象更加簡單)
在android side:

  1. public void onCreate(Bundle icicle) {   
  2.         super.onCreate(icicle);  
  3.         setContentView(R.layout.main);  
  4.         Collect conCollect = new Collect(new Person[]{new Person("yzq",12),new Person("johnny",21)});  
  5.         String ba1 = null;  
  6.         try {  
  7.             ba1 = Base64.encodeObject(conCollect);  
  8.         } catch (IOException e) {  
  9.             e.printStackTrace();  
  10.   
  11.         ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();  
  12.   
  13.         nameValuePairs.add(new BasicNameValuePair("image", ba1));  
  14.   
  15.         try {  
  16.   
  17.             HttpClient httpclient = new DefaultHttpClient();  
  18.   
  19.             HttpPost httppost = new  
  20.   
  21.             HttpPost(  
  22.                     "http://192.168.0.101:8080/ServletClassloadTest/servlet/UploadImage");  
  23.   
  24.             httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));  
  25.   
  26.             HttpResponse response = httpclient.execute(httppost);  
  27.   
  28.             HttpEntity entity = response.getEntity();  
  29.   
  30.             is = entity.getContent();  
  31.   
  32.         } catch (Exception e) {  
  33.   
  34.             Log.e("log_tag""Error in http connection " + e.toString());  
  35.   
  36.         }  
  37.   
  38.     }  

Person類

  1. public class Person implements Serializable{   
  2.   
  3.     private String name;  
  4.     private int age;  
  5.   
  6.     public Person(String name, int age) {  
  7.         super();  
  8.         this.name = name;  
  9.         this.age = age;  
  10.     }  
  11.   
  12.     public String getName() {  
  13.         return name;  
  14.     }  
  15.   
  16.     public void setName(String name) {  
  17.         this.name = name;  
  18.     }  
  19.   
  20.     public int getAge() {  
  21.         return age;  
  22.     }  
  23.   
  24.     public void setAge(int age) {  
  25.         this.age = age;  
  26.     }  
  27. }  
  28. Collect 類  
  29. public class Collect implements Serializable{   
  30.   
  31.     public Person[] ps;  
  32.   
  33.     public Collect(Person[] ps) {  
  34.         super();  
  35.         this.ps = ps;  
  36.     }  
  37. }  

在server side: 

  1. public void doPost(HttpServletRequest request, HttpServletResponse response)   
  2.             throws ServletException, IOException {  
  3.         response.setContentType("text/html");  
  4.         String image = request.getParameter("image");  
  5.         System.out.println("result"+image);  
  6.         try {  
  7.             Collect collect = (Collect)com.ieheima.servlet.Base64.decodeToObject(image);  
  8.   
  9.             Person[] ps = collect.ps;  
  10.             System.out.println("長度:"+ps.length);  
  11.             for (int i = 0; i < ps.length; i++) {  
  12.                 System.out.println(ps[i].getName());  
  13.             }  
  14.         } catch (ClassNotFoundException e) {  
  15.             e.printStackTrace();  
  16.         }  
  17. }  

在控制台輸出結果:

需要注意的是在服務器端也要有相同的類Collect和Person,同時包名也要一樣.如果傳輸的對象過大,可能會導致內存溢出.

還需要給實現了Serializable接口的類,定一個一個serialVersionUID

希望以上Base64的講解能夠對讀者有幫助,如果有什麼錯誤盡情讀者批評之處,不勝感謝。

Copyright © Linux教程網 All Rights Reserved