Bitmap转成byte[]再用base64转成string

来源:互联网 发布:listview的优化 编辑:程序博客网 时间:2024/06/05 04:37
用户上传头像,上传的头像图片需要上传至服务器的MySQL数据库保存,当用户上传成功之后每次登陆后从数据库获取头像信息显示。

由于之前一直使用JSON作为客户端和服务器端数据传输形式,JSON虽然使用方便但是不支持自定义类型,所以遇到的问题就是将二进制图片文件转成String,再传到服务器并保存到数据库。

在查阅了一些资料后想出了一个方法:

1,将图片转换成Byte[]

2,利用Base64将Byte[]加密编码转换成String

3,利用JSON将String传到服务器,由于图片一般转换后的String 是很大的,所以在mysql中保存为MEDIUMTEXT类型。方便以后从数据库直接读出来通过JSON再返回客户端解析后显示。

4,显示时将从数据库读出来的String通过Base64解码成Byte[];

5,用BitmapFactory将Byte[]转换成Bitmap显示。

A客户端向服务器端发送:

[java] view plain copy
print?
  1. private void edit_headPicture(Bitmap bitmap) {  
  2.         ByteArrayOutputStream baos = new ByteArrayOutputStream();//将Bitmap转成Byte[]  
  3.         bitmap.compress(Bitmap.CompressFormat.PNG, 50, baos);//压缩  
  4.         headPicture =Base64.encodeToString(baos.toByteArray(),Base64.DEFAULT);//加密转换成String  
  5.         int n=headPicture.length();  
  6.         Thread submit=new Thread(new SubmitThread());  
  7.         submit.start();  
  8.     }  
  9.       
  10.     class SubmitThread implements Runnable  
  11.     {  
  12.         Message msg = handler.obtainMessage();  
  13.         @Override  
  14.         public void run() {  
  15.             // TODO Auto-generated method stub  
  16.             JSONObject object=new JSONObject();  
  17.             try {  
  18.                 object.put("headPicture", headPicture);  
  19.                 msg.what=Server(object);  
  20.                 handler.sendMessage(msg);  
  21.             } catch (JSONException e) {  
  22.                 // TODO Auto-generated catch block  
  23.                 e.printStackTrace();  
  24.             }  
  25.         }  
  26.     }  
  27.     public int Server(JSONObject object)  
  28.     {  
  29.         String path=LoginActivity.URL+"SetInfoManager";  
  30.         try{  
  31.             URL url=new URL(path);  
  32.             String content = String.valueOf(object);  
  33.             HttpURLConnection conn = (HttpURLConnection) url.openConnection();  
  34.             conn.setConnectTimeout(5000);  
  35.             conn.setDoOutput(true);  
  36.             conn.setRequestMethod("POST");  
  37.             conn.setRequestProperty("User-Agent""Fiddler");  
  38.             conn.setRequestProperty("Content-Type""application/json");  
  39.             OutputStream os = conn.getOutputStream();  
  40.             os.write(content.getBytes());  
  41.             os.close();  
  42.             int code = conn.getResponseCode();  
  43.             if(code == 200)  
  44.             {  
  45.                 BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));  
  46.                 String result="";  
  47.                 result = in.readLine();  
  48.                 in.close();  
  49.                 return Integer.parseInt(result);  
  50.             }  
  51.             else return 0;  
  52.         }catch (MalformedURLException e) {    
  53.             // TODO Auto-generated catch block    
  54.             e.printStackTrace();    
  55.         } catch (IOException e) {    
  56.             // TODO Auto-generated catch block    
  57.             e.printStackTrace();    
  58.        }   
  59.         return 0;  
  60.     }  

B:服务器接收代码:

[java] view plain copy
print?
  1. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
  2.         StringBuffer buffer=new StringBuffer();  
  3.         String line="";  
  4.         request.setCharacterEncoding("UTF-8");  
  5.         BufferedReader reader=request.getReader();  
  6.         while((line=reader.readLine())!=null)  
  7.         {  
  8.             buffer.append(line);  
  9.         }  
  10.         try {  
  11.             JSONObject object=new JSONObject(buffer.toString());  
  12.             int result=new SetInfoManagerDB(object).Update();  
  13.             response.getOutputStream().write((result+"").getBytes());  
  14.         } catch (JSONException e) {  
  15.             // TODO Auto-generated catch block  
  16.             e.printStackTrace();  
  17.         }  
  18.     }  
  19.   
  20.   
  21. <span style="white-space:pre">        </span> sql="update companyview set headPicture=? where e_Name=?";  
  22.             try {  
  23.                 try {  
  24.                     stmt=conn.prepareStatement(sql);  
  25.                     stmt.setString(1, object.getString("headPicture"));  
  26.                     stmt.setString(2, username);  
  27.                     stmt.executeUpdate();  
  28.                     stmt.close();  
  29.                     return 4;  
  30.                 } catch (SQLException e) {  
  31.                     // TODO Auto-generated catch block  
  32.                     e.printStackTrace();  
  33.                     return 6;  
  34.                 }  

C:客户端解析并显示:

[java] view plain copy
print?
  1. String s=view.getString("headPicture");  
  2.                     if(s.equals(""))  
  3.                         btn_user.setImageResource(R.drawable.ic_launcher);  
  4.                     else  
  5.                     {  
  6.                         byte[] bytes = Base64.decode(view.getString("headPicture"), Base64.DEFAULT);  
  7.                         btn_user.setImageBitmap(BitmapFactory.decodeByteArray(bytes, 0, bytes.length));  
  8.                     }  
原创粉丝点击