android通过Base64往服务器上传图片和对象

在下载Base64.java文件 http://iharder.sourceforge.net/current/java/base64/,分别添加到客户端和服务器端.


1>我们知道在web中实现文件上传可以通过apache的项目,那么在android中把文件上传到服务器端,当然也可以通过该方式,但是也可以通过base64,
这样就相当于把一个字符串传到服务器,然后在服务器端通过Base64.decode()方法解码接口,返回的字节数组byte[]


  在android side:
[java]  view plain copy
  1. "font-size:18px;">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 nameValuePairs = new ArrayList();  
  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:
[java]  view plain copy
  1. "font-size:18px;">        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:

[java]  view plain copy
  1. "font-size:18px;">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 nameValuePairs = new ArrayList();  
  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.     }  
  39.   

[java]  view plain copy
  1. "font-size:18px;">Person类  
  2. public class Person implements Serializable{   
  3.   
  4.     private String name;  
  5.     private int age;  
  6.   
  7.     public Person(String name, int age) {  
  8.         super();  
  9.         this.name = name;  
  10.         this.age = age;  
  11.     }  
  12.   
  13.     public String getName() {  
  14.         return name;  
  15.     }  
  16.   
  17.     public void setName(String name) {  
  18.         this.name = name;  
  19.     }  
  20.   
  21.     public int getAge() {  
  22.         return age;  
  23.     }  
  24.   
  25.     public void setAge(int age) {  
  26.         this.age = age;  
  27.     }  
  28. }  
  29. Collect 类  
  30. public class Collect implements Serializable{   
  31.   
  32.     public Person[] ps;  
  33.   
  34.     public Collect(Person[] ps) {  
  35.         super();  
  36.         this.ps = ps;  
  37.     }  
  38. }  
  39. 在server side:  
  40. public void doPost(HttpServletRequest request, HttpServletResponse response)   
  41.             throws ServletException, IOException {  
  42.         response.setContentType("text/html");  
  43.         String image = request.getParameter("image");  
  44.         System.out.println("result"+image);  
  45.         try {  
  46.             Collect collect = (Collect)com.ieheima.servlet.Base64.decodeToObject(image);  
  47.   
  48.             Person[] ps = collect.ps;  
  49.             System.out.println("长度:"+ps.length);  
  50.             for (int i = 0; i < ps.length; i++) {  
  51.                 System.out.println(ps[i].getName());  
  52.             }  
  53.         } catch (ClassNotFoundException e) {  
  54.             e.printStackTrace();  
  55.         }  
  56. }  
  57. 在控制台输出结果:  
  58.   

需要注意的是在服务器端也要有相同的类Collect和Person,同时包名也要一样.如果传输的对象过大,可能会导致内存溢出.
还需要给实现了Serializable接口的类,定一个一个serialVersionUID


希望以上Base64的讲解能够对读者有帮助,如果有什么错误尽情读者批评之处,不胜感谢..
转载请注明出处: http://blog.csdn.net/johnny901114/article/details/7536764

你可能感兴趣的:(android)