歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Android通過Base64往服務器上傳圖片和對象

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

日期:2017/3/1 10:13:47   编辑:Linux編程

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

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

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

在android side:

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

在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. ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
  11. nameValuePairs.add(new BasicNameValuePair("image", ba1));
  12. try {
  13. HttpClient httpclient = new DefaultHttpClient();
  14. HttpPost httppost = new
  15. HttpPost(
  16. "http://192.168.0.101:8080/ServletClassloadTest/servlet/UploadImage");
  17. httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
  18. HttpResponse response = httpclient.execute(httppost);
  19. HttpEntity entity = response.getEntity();
  20. is = entity.getContent();
  21. } catch (Exception e) {
  22. Log.e("log_tag", "Error in http connection " + e.toString());
  23. }
  24. }

Person類

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

在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. Person[] ps = collect.ps;
  9. System.out.println("長度:"+ps.length);
  10. for (int i = 0; i < ps.length; i++) {
  11. System.out.println(ps[i].getName());
  12. }
  13. } catch (ClassNotFoundException e) {
  14. e.printStackTrace();
  15. }
  16. }

在控制台輸出結果:

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

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

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

Copyright © Linux教程網 All Rights Reserved