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

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

咱们先一步一步的来,首先,我们要获取本地的图片,无论你们是采用拍照、相册或是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里面去,下次用户离线进去的时候就可以看到自己的数据啦。

时间: 2024-09-08 04:51:03

用户头像base64编码上传与保存头像问题的相关文章

c#做网站时。。注册新用户时,同时上传个人形象照??

问题描述 c#做网站时..注册新用户时,同时上传个人形象照??并显示啊..菜鸟急求解 解决方案 解决方案二:首先注册用户的时候要让用户上传照片,插入数据的时候把照片在服务器上的相对路径存入数据库,显示的时候把路径取出来赋值给图片控件.解决方案三:能不能说具体点啊..其它的我都做好了,,就是不能看到图片啊...解决方案四:那个我是这样做的:首先有一个头像控件与一个点击上传的按钮:<asp:ImageID="ImageMyhead"name="ImageMyhead&quo

webuploader 上传 后台保存的问题

问题描述 webuploader 上传 后台保存的问题 分片保存的时候,怎么保存?如果上传并发超过1个的时候,就会出现一个分片上传服务器还没处理结束,第二个分片同时就到了,那样就会出现文件被占用的错误.等等问题 该如何解决?能不能贴贴保存文件的代码

服务器 工具-pure-ftp 匿名用户可改写自己上传的文件

问题描述 pure-ftp 匿名用户可改写自己上传的文件 pure-ftp 匿名用户可以改写自己上传的文件,需要在pure-ftpd.conf配置文件里怎么配置,希望各位帮帮忙

Struts2中图片以base64方式上传至数据库_java

1.页面 这里输入代码 <div> <span id="uploadImg" style="margin:50px;background-color:#ddd;display:inline-block;height:130px;width:200px;"> <span style="color:#bbb;font-weight:600;border:2px #ccc dashed;font-size:20px;text-ali

asp.net 上传文件保存到数据库的方法( C#)

asp教程.net 上传文件保存到数据库教程的方法( C#) C#做一个小的程序,其中用涉及到了照片的存取与显示,在网上搜索了很多有关的代码,但是几乎没有完整,大部分只是其中的存取或者显示代码,笔者将其整理了一下,形成了一个集照片上传到数据库.照片显示于一体的小模块. using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawin

php实现base64图片上传方式实例代码

本例子中没有采用File Post上传文件方式!原理一样,为了更加的理解base64 选择将其输出在文本域中,并提交至服务器!运用到项目中建议采用提交File方式. html代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns=&q

thinkphp实现文件上传同时保存文件路径在数据库中

thinkphp有文件上传类我们只要调用就可以了并不需要其它的操作,我们简单介绍一下这个类. 上传类使用ORG.Net.UpdateFile类,最新版本的上传类包含的功能如下(有些功能需要结合ThinkPHP系统其他类库): 基本上传功能 支持批量上传 支持生成图片缩略图 自定义参数上传 上传检测(包括大小.后缀和类型) 支持覆盖方式上传 支持上传类型.附件大小.上传路径定义 支持哈希或者日期子目录保存上传文件 上传图片的安全性检测 支持上传文件命名规则 支持对上传文件的Hash验证 在Thin

关于struts2文件上传和保存到数据库的同步问题!急~

问题描述 利用struts2文件上传后,对文件信息保存到数据库.文件上传成功后,对文件信息进行保存,失败则不保存.问题就在于如果文件上传成功后,对数据库保存失败,那么该如何保持事务的准确性.目前相到两种解决方法:1.建立temp临时文件夹,当保存数据库成功,则copy文件到正式目录,不论文件上传成功失败,最后删除temp.(麻烦)2.使用异步对文件进行操作.(不大清楚实现逻辑)希望大家能给我提供方案.谢谢~ 解决方案 先插入数据,成功则保存文件,不成功则不进行处理不就可以了么解决方案二:同意ji

将用户多余的物品“上传”到仓库

摘要: 在北京租过房子的人都知道北京的房价有多贵,稍微宽敞一点又不算太贵的房子基本就快到河北了.因此,许多人为了方便,会在城区离公司近的地方租一间狭小的房间.然而问题是, 在北京租过房子的人都知道北京的房价有多贵,稍微宽敞一点又不算太贵的房子基本就快到河北了.因此,许多人为了方便,会在城区离公司近的地方租一间狭小的房间.然而问题是,因为空间狭小,可能会发现许多东西堆不下,扔掉又舍不得.寸土寸金的美国纽约也面临着相同的问题,因此纽约的初创公司MakeSpace允许顾客将多余的物品"上传"