本文包括1、如何上传图片文件到Bmob上,2、从Bmob上下载图片文件,3、更新Bmob上的图片文件。
以下是在”个人中心”界面上,实现用户更改头像的例子。
(用户在新注册的时候会默认显示一张头像图片,等到用户打开相机拍照或从相册中选择一张图片更改头像的时候会替换原来的默认头像,之后在登陆的时候会显示用户自己更改的头像)
Bmob官方Android开发文档:
http://doc.bmob.cn/data/android/develop_doc/
找到8、文件管理 :
一、上传图片到Bmob上
1、首先要在Bmob上创建一个表
2、在Android中创建一个JavaBean类,名字和Bmob上创建的表的名字一样
public class advertisement extends BmobObject {
private String name;//用户名
private BmobFile Picture;//用户头像
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public BmobFile getPicture() {
return Picture;
}
public void setPicture(BmobFile icon) {
Picture = icon;
}
}
3、代码
在代码中我是通过打开系统相机或从相册中选择一张图片调用upload()方法上传到Bmob上的,所以imgpath是图片的地址。
关键代码:
//上传图片到表中
private void upload(String imgpath){
final BmobFile bmobFile = new BmobFile(new File(imgpath));
bmobFile.uploadblock(new UploadFileListener() {
@Override
public void done(BmobException e) {
if(e==null){
advertisement ad = new advertisement();
ad.setName(HomeFragment.current_user);//当前的用户名
ad.setPicture(bmobFile);//该用户的头像图片
ad.save();
//bmobFile.getFileUrl()--返回的上传文件的完整地址
Log.w("bbb",bmobFile.getFileUrl());
Toast.makeText(getContext(),"上传文件成功:" + bmobFile.getFileUrl(),Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(getContext(),"上传文件失败:" + e.getMessage(),Toast.LENGTH_SHORT).show();
}
}
});
}
用户名是aaa,上传的图片是all.png。
二、把图片上传到Bmob的应用文件上
图片除了可以上传到表中,还可以上传到Bmob中的素材里的应用文件上
代码:
private void upload(String imgpath){
final BmobFile bmobFile = new BmobFile(new File(imgpath));
bmobFile.uploadblock(new UploadFileListener() {
@Override
public void done(BmobException e) {
if(e==null){
//bmobFile.getFileUrl()--返回的上传文件的完整地址
Log.w("bbb",bmobFile.getFileUrl());
Toast.makeText(getContext(),"上传文件成功:" + bmobFile.getFileUrl(),Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(getContext(),"上传文件失败:" + e.getMessage(),Toast.LENGTH_SHORT).show();
}
}
});
}
三、用户更改头像:
更改用户头像也就是把用户上传过的图片头像替换掉,但是这里会有一个问题:已上传过头像的用户可以选择替换,但是新注册、还没有上传过头像文件(此时是默认头像图片)的用户是没有办法进行替换的,必须选择上传。
所以,我在注册用户账号那里,写了上传默认头像图片的代码。每个用户注册的时候,会把用户名和默认的头像文件上传到advertisement中。
这样,用户想要更改头像的时候都可以直接调用替换头像图片的方法。
(暂时只能想到这种办法,如果有更好的办法一定要告诉我唷,谢谢!)
1、在应用文件上,上传一张图片作为默认的头像图片,在每个用户注册的时候都可以根据这张图片的uri地址来获取图片并上传到advertisement表中作为该用户的头像,方便以后用户更新头像图片的时候,直接调用更新的方法。
在上传的时候可以打印all.png的地址,方便注册的时候找到这张图。
2、每个用户刚注册的时候会在advertisement表中上传默认的头像图片和用户名。
//在注册的时候顺便把用户的名字,系统默认的头像图片上传到advertisement表中,方便用户查询更改头像
//Bmob上默认头像的地址
BmobFile bmobfile =new BmobFile("all.png","","http://bmob-cdn-25638.b0.upaiyun.com/2019/05/14/6356af9b40b740579394fd717fe7eb2e.png");
bmobfile.download(new DownloadFileListener() {
@Override
public void onProgress(Integer integer, long l) {
}
@Override
public void done(String s, BmobException e) {
if(e == null){
//下载默认图片并长传到advertisement表中
final BmobFile bmobFile = new BmobFile(new File(s));
bmobFile.uploadblock(new UploadFileListener() {
@Override
public void done(BmobException e) {
if(e==null){
advertisement ad = new advertisement();
ad.setName(new_username);//用户名
ad.setPicture(bmobFile);//默认头像图片
ad.save();
//bmobFile.getFileUrl()--返回的上传文件的完整地址
Log.w("bbb",bmobFile.getFileUrl());
Toast.makeText(RegisterActivity.this,"上传文件成功:" + bmobFile.getFileUrl(),Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(RegisterActivity.this,"上传文件失败:" + e.getMessage(),Toast.LENGTH_SHORT).show();
}
}
});
}
}
});
http://bmob-cdn-25638.b0.upaiyun.com/2019/05/14/6356af9b40b740579394fd717fe7eb2e.png"是all.png的地址。
3、更新用户的头像图片:
思路:根据当前的用户名从表中查找对应ObjectId,再根据ObjectId更新(update)头像图片。(更新只能根据ObjectId)
//更新表中对应用户的头像图片
private void upload(String imgpath){
final BmobFile bmobFile = new BmobFile(new File(imgpath));
bmobFile.uploadblock(new UploadFileListener() {
@Override
public void done(BmobException e) {
if(e==null){
BmobQuery query = new BmobQuery();
query.addWhereEqualTo("name", HomeFragment.current_user);
final String[] objectId = new String[1];
query.findObjects(new FindListener() {
@Override
public void done(List list, BmobException e) {
if (e == null){
for (advertisement ad : list){
objectId[0] = ad.getObjectId();
Log.w(TAG, "获取id成功"+ objectId[0]);
}
advertisement ad2 = new advertisement();
ad2.setPicture(bmobFile);
ad2.update(objectId[0], new UpdateListener() {
@Override
public void done(BmobException e) {
if (e == null){
Toast.makeText(getContext(), "信息更新成功", Toast.LENGTH_SHORT).show();
}else {
Log.w(TAG, "失败"+e.getErrorCode());
}
}
});
}else {
Log.w(TAG, "获取id失败"+e.getErrorCode());
}
}
});
//bmobFile.getFileUrl()--返回的上传文件的完整地址
Log.w("bbb",bmobFile.getFileUrl());
Toast.makeText(getContext(),"上传文件成功:" + bmobFile.getFileUrl(),Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(getContext(),"上传文件失败:" + e.getMessage(),Toast.LENGTH_SHORT).show();
}
}
});
}
比如:
注册一个账号:用户名为bbb
默认头像是all.png。
更改头像:
更新成功!
四、从Bmob中下载图片
查找advertisement表中所有数据,判断每条数据的用户名(name),如果和当前用户的名字一样,则下载该用户对应的头像图片并显示。
//下载图片
BmobQuery query=new BmobQuery();
query.findObjects(new FindListener() {
@Override
public void done(List list, BmobException e) {
if(e == null){
show_ad(list);
}else{
Toast.makeText(getContext(),""+e.getMessage(),Toast.LENGTH_LONG).show();
}
}
});
public void show_ad(List list){
for (advertisement ad : list){
if(ad.getName() != null && HomeFragment.current_user.equals(ad.getName())){
Log.w("nnn","ad.getName()==="+ad.getName()+"HomeFragment.current_user==="+HomeFragment.current_user);
BmobFile icon= ad.getPicture();
icon.download(new DownloadFileListener() {
@Override
public void onProgress(Integer integer, long l) {
}
@Override
public void done(String s, BmobException e) {
if(e == null){
//设置圆形头像并显示
h_head.setImageBitmap(round_Util.toRoundBitmap(BitmapFactory.decodeFile(s))); //根据地址解码并显示图片
}
}
});
break;
}
}
}