Android记一次头像上传与显示

来源:互联网 发布:淘宝双面绸缎丝带 编辑:程序博客网 时间:2024/06/01 20:33

概述

本文主要内容

  • 前提
  • 头像上传
  • 头像显示
  • 关键代码
  • 踩坑指南

前提

1.用户登录后将用户数据存到本地Sqlite数据库,即User表.
2.Sdcard中test目录下的avatar.jpg文件,该文件用于下面的头像上传和显示。

头像上传

1.需要将本地图片文件转换成Base64编码
2.将剪裁后的图片替换test文件夹下的avatar.jpg,上传服务器成功后,服务器会返回头像文件在服务器上的路径,将此路径存到本地User表中,并加载本地头像文件;若上传服务器失败则删除该文件,防止下次加载头像会加载上传失败的图片。

头像显示

先判断test文件夹下的avatar.jpg文件是否存在,如果存在则调用相关方法直接加载显示在ImageView上即可;如果不存在,则先从服务器上下载到Scard中的test下,取名avatar.jpg,然后调用相关方法显示即可。这样做可防止本地头像文件被意外删除后显示不出来的问题。

关键代码

1.请求服务器的方法(使用的是Retrofit+RxJava),因为默认的POST请求有长度限制,所以要使用@FormUrlEncoded属性

    @FormUrlEncoded    @POST("app/my/upload_avatar")    Observable<RootBean> uploadAvatar(            @Field("app_key") String app_key,            @Field("userid") Integer userid,            @Field("avatar") String avatar);

2.将文件转成Base64编码的工具类

    /**     * 图片转化成base64字符串     * @param path 图片路径     * @return Base64编码     */    public static String FileToBase64(String path) {// 将图片文件转化为字节数组字符串,并对其进行Base64编码处理        InputStream in = null;        byte[] data = null;        // 读取图片字节数组        try {            in = new FileInputStream(path);            data = new byte[in.available()];            in.read(data);            in.close();        } catch (IOException e) {            e.printStackTrace();        }        // 对字节数组Base64编码        BASE64Encoder encoder = new BASE64Encoder();        return encoder.encode(data);// 返回Base64编码过的字节数组字符串    }

3.使用Glide加载本地图片

    /**     * 加载本地图片,并且不使用任何缓存     *     * @param context     上下文     * @param path        本地图片路径     * @param drawable_id 默认图     * @param iv          ImageView控件     */    public static void getSdcardImage(Context context, String path, int drawable_id, ImageView iv) {        Drawable lDrawable = ResourcesCompat.getDrawable(context.getResources(), drawable_id, null);        File file = new File(path);        Glide.with(context)                .load(file)                .centerCrop()                .error(lDrawable)//加载出错                .skipMemoryCache(true)//跳过内存缓存                .diskCacheStrategy(DiskCacheStrategy.NONE)//不使用硬盘缓存                .into(iv);    }

踩坑指南:

W/System.err: retrofit2.adapter.rxjava.HttpException: HTTP 414 Request-URI Too Large

1.因@POST方法请求长度限制引发的错误,解决: 请求方法上添加@FormUrlEncoded,并指定请求方法中的参数为 @Field(“app_key”) String app_key,否则会引起下面的错误。

Caused by: java.lang.IllegalArgumentException: Form-encoded method must contain at least one @Field.

2.参考错误1

原创粉丝点击