Android 开发 上传用户头像到服务器的数据库再获取显示

最近和队友在做一个Android APP,昨天遇到用户上传头像,上传的头像图片需要上传至服务器的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客户端向服务器端发送:

private void edit_headPicture(Bitmap bitmap) {
		ByteArrayOutputStream baos = new ByteArrayOutputStream();//将Bitmap转成Byte[]
		bitmap.compress(Bitmap.CompressFormat.PNG, 50, baos);//压缩
		headPicture =Base64.encodeToString(baos.toByteArray(),Base64.DEFAULT);//加密转换成String
		int n=headPicture.length();
		Thread submit=new Thread(new SubmitThread());
		submit.start();
	}
	
	class SubmitThread implements Runnable
    {
    	Message msg = handler.obtainMessage();
		@Override
		public void run() {
			// TODO Auto-generated method stub
			JSONObject object=new JSONObject();
			try {
				object.put("headPicture", headPicture);
				msg.what=Server(object);
				handler.sendMessage(msg);
			} catch (JSONException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
    }
    public int Server(JSONObject object)
    {
    	String path=LoginActivity.URL+"SetInfoManager";
    	try{
    		URL url=new URL(path);
    		String content = String.valueOf(object);
        	HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        	conn.setConnectTimeout(5000);
        	conn.setDoOutput(true);
        	conn.setRequestMethod("POST");
        	conn.setRequestProperty("User-Agent", "Fiddler");
        	conn.setRequestProperty("Content-Type", "application/json");
        	OutputStream os = conn.getOutputStream();
        	os.write(content.getBytes());
        	os.close();
        	int code = conn.getResponseCode();
        	if(code == 200)
        	{
        		BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
        		String result="";
        		result = in.readLine();
        		in.close();
        		return Integer.parseInt(result);
        	}
        	else return 0;
    	}catch (MalformedURLException e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
        } catch (IOException e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
       } 
    	return 0;
    }

B:服务器接收代码:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		StringBuffer buffer=new StringBuffer();
		String line="";
		request.setCharacterEncoding("UTF-8");
		BufferedReader reader=request.getReader();
		while((line=reader.readLine())!=null)
		{
			buffer.append(line);
		}
		try {
			JSONObject object=new JSONObject(buffer.toString());
			int result=new SetInfoManagerDB(object).Update();
			response.getOutputStream().write((result+"").getBytes());
		} catch (JSONException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}


<span style="white-space:pre">		</span> sql="update companyview set headPicture=? where e_Name=?";
			try {
				try {
					stmt=conn.prepareStatement(sql);
					stmt.setString(1, object.getString("headPicture"));
					stmt.setString(2, username);
					stmt.executeUpdate();
					stmt.close();
					return 4;
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
					return 6;
				}

C:客户端解析并显示:

String s=view.getString("headPicture");
					if(s.equals(""))
						btn_user.setImageResource(R.drawable.ic_launcher);
					else
					{
						byte[] bytes = Base64.decode(view.getString("headPicture"), Base64.DEFAULT);
						btn_user.setImageBitmap(BitmapFactory.decodeByteArray(bytes, 0, bytes.length));
					}





Android的登录注册功能在应用程序中很常见,我们可以使用SharedPreferences和SQLite数据库来保存用户的登录信息。同时,还可以实现头像上传显示功能。 首先,登录注册功能可以通过SharedPreferences来实现。在注册过程中,我们将用户输入的用户名和密码保存到SharedPreferences中。在登录过程中,我们将用户输入的用户名和密码与SharedPreferences中保存的数据进行比对,以验证用户输入的正确性。 另一种实现方式是使用SQLite数据库来保存用户的登录信息。在注册过程中,我们将用户输入的用户名和密码保存到SQLite数据库表中的相应字段。在登录过程中,我们通过查询数据库中的数据,以验证用户输入的正确性。 头像上传显示功能可以通过网络通信来实现。在用户注册或登录成功后,我们可以提供上传头像的选项。用户选择一个本地的头像文件后,我们可以将该文件通过网络上传服务器上进行保存。在用户登录后,我们可以从服务器获取用户头像,并在应用程序中显示出来。 为了实现头像上传显示功能,我们可以使用第三方库或者自己编写相关的网络通信代码。在上传头像时,我们需要头像文件进行编码和拆分,然后将每一部分通过HTTP请求发送到服务器上进行保存。在显示头像时,我们需要服务器上下载头像文件,并将其显示在应用程序的合适位置上。 总之,Android的登录注册功能可以通过SharedPreferences和SQLite来保存用户的登录信息。而头像上传显示功能则可以通过网络通信来实现。这样用户就可以方便地注册登录,并上传显示头像了。
评论 25
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值