用户头像base64编码上传与保存头像问题

    xiaoxiao2026-06-17  10

    今天这篇博文主要讲思想,可能别人还有更好的学习思路,如果觉得还有更好的想法的可以留言博主哦^-^

    咱们先一步一步的来,首先,我们要获取本地的图片,无论你们是采用拍照、相册或是drawable资源返回的Bitmap,我们先拿到这个图片,一般我们上传都需要给图片进行压缩(质量压缩和比例压缩),今天就不谈文件压缩的事情了,我们先切中重点,下面是我获取到资源文件的bitmap

    获取bitmap图片 Bitmap bitmap =BitmapFactory.decodeResource(getResources(),R.drawable.pb_load); //这是原始大小的图片,你们可以经过压缩图片的方式来返回一个bitmap 将bitmap图片生成base64编码 // 将图片转换成base64编码 public static String getBase64(Bitmap bitmap) { ByteArrayOutputStream out = new ByteArrayOutputStream(); //压缩的质量为60% bitmap.compress(CompressFormat.PNG, 60, out); //生成base64字符 String base = Base64.encodeToString(out.toByteArray(), Base64.DEFAULT); return base; }

    好了,现在我们已经拿到这个字符串了,我们可以向服务器通过post提交我们的字符串了,post提交代码

    post提交base编码 public static String upLoad(String base64) { NameValuePair value = new BasicNameValuePair("user_photo", base64); List<NameValuePair> list = new ArrayList<NameValuePair>(); list.add(value); try { HttpEntity requestHttpEntity = new UrlEncodedFormEntity(list, HTTP.UTF_8); HttpPost httpPost = new HttpPost("上传的路径名称path"); httpPost.setEntity(requestHttpEntity); HttpClient httpClient = new DefaultHttpClient(); HttpResponse response = httpClient.execute(httpPost); result = EntityUtils.toString(response.getEntity()) } catch (UnsupportedEncodingException e) { e.printStackTrace(); result "false"; } catch (ClientProtocolException e) { e.printStackTrace(); result "false"; } catch (IOException e) { e.printStackTrace(); result "false"; } return result; } php端代码 //用当前时间点来作为图片的文件名,为了避免图片的名称重复 $filename=date("ymdhis"); $file=fopen($filename,"png","w"); //判断user_photo是否存在 并且获取的内容是否为空 if(isset($_POST['user_photo'])&&!empty($_POST['user_photo'])){ $data=base64_decode($_POST['user_photo']); fwrite($file,$data); echo 'true'; }else{ echo 'false'; }

    好了,现在上传部分基本完成了,接下来就是如何将图片离线保存了。


    我们看到, 上传完文件后会有一个返回值,我们需要在返回值为true的时候来做些什么,返回false当然就是直接Toast一下提示用户上传失败啦! 现在假设返回的是成功,我们就需要将当前这个base64编码保存在本地,我用的方法是通过SharedPrefrence来保存的

    SharePrefrenceTools.java public class SharePrefrenceTools { private static final String SHARE_NAME = "picture"; private static final String KEY = "photo"; // 设置base64编码进shareP public static void putBase64(Context context, String base) { // 设置share的name和访问方式(私有) SharedPreferences share = context.getSharedPreferences(SHARE_NAME, Context.MODE_PRIVATE); Editor edit = share.edit(); // 将base存进去 edit.putString(KEY, base); // 提交进文件 edit.commit(); } // 从shareP取出base64编码 public static String getBase64(Context context) { SharedPreferences share = context.getSharedPreferences(SHARE_NAME, Context.MODE_PRIVATE); // 从文件中取出key对应的base64编码 String base = share.getString(KEY, ""); return base; }

    通过上面的工具类,我们可以将上传成功的base64编码通过SharePrefrenceTools.putBase64(this,base)put进去,现在离线图片已经保存好了。

    接下来我们需要解决的问题就是,如何离线呈现图片。 我们在启动用户的Activity的时候,先判断本地是否有base64编码的图片

    String result=SharePrefrenceTools.getBase64(this);

    我们可以判断这个返回值result,如果返回为空,就是没有离线图片,我们可以显示一张加载失败的图片(这种情况一般只出现在用户第一次注册登陆的情况,因为那时share肯定是空的,我们就可以为用户设置一张默认头像,这应该是用户注册成功后显示一张默认图片的原因吧)。 好了,现在我们拿到这个编码过的base64了,怎么将他反编译回去生成bitmap呢,哈哈,代码来啦

    // 将base64编码生成图片 public static Bitmap getBitmap(String base64) { byte[] arr = Base64.decode(base64, Base64.DEFAULT); ByteArrayInputStream in = new ByteArrayInputStream(arr); Bitmap bitmap = BitmapFactory.decodeStream(in); return bitmap; }

    现在我们拿到这个离线的bitmap了,就可以直接设置到当前的界面上去啦。很简单吧。 为了说的更通俗点,列出在启动Activity的代码

    @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ImageView img = (ImageView) findViewById(R.id.user_photo); String base = SharePrefrenceTools.getBase64(MainActivity.this); //首先判断share里面是否存储了该图片,有的话显示,没得话显示默认图 if (base.equals("")) { img.setImageResource(R.drawable.ic_launcher); } else { Bitmap bitmap = Bitmap2Base64.getBitmap(base); img.setImageBitmap(bitmap); } }

    还有一个我要讲的,就是我们在退出用户登陆的时候,一定要记得将SharePrefrenceTools里面的所有离线用户信息clear掉,以免下一次其他的用户登陆的时候造成数据的错乱,在SharePrefrenceTools还要加上这个函数

    public static void CleanBase64(Context context) { // 设置share的name和访问方式(私有) SharedPreferences share = context.getSharedPreferences(SHARE_NAME, Context.MODE_PRIVATE); Editor edit = share.edit(); // 将key对应的内容设置为空 edit.putString(KEY, ""); // 提交进文件 edit.commit(); }

    我这里模拟的是clear了图片资源,像用户nick,gender等离线信息都可以通过这个方式去保存,不过一定要记得,退出登陆要全部清除离线数据,在重新登陆的时候重新去网络获取数据,获取到了数据后依然想上面的方法一样,存储到shared里面去,下次用户离线进去的时候就可以看到自己的数据啦。

    最新回复(0)