概述
本文主要内容
- 前提
- 头像上传
- 头像显示
- 关键代码
- 踩坑指南
前提
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