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的讲解能够对读者有帮助,如果有什么错误尽情读者批评之处,不胜感谢。

相关内容