Bmob上传、下载文件___(课设遇到的问题)

课设终于做完了,总结一下这个过程中遇到的问题。
Bmob的上传、下载文件。
说实话,Bmob的开发文档实在是坑,就写了点最简单的用法,而且当时去网上找资料也是找了好久,没几篇能看的,最后我也不知道怎么的就把上传、下载搞好了。。。现在来总结一下:

我这个方法的目的是给Bmob数据库内的User表的某一个用户设置对应头像。
先上代码:

private void uploadPic() {

        final String imagePath = getExternalCacheDir()+ "/output_image.ipg";
        final BmobFile icon = new BmobFile(new File(imagePath));

        icon.uploadblock(new UploadFileListener() {
            @Override
            public void done(BmobException e) {
                if (e == null){
                    Log.w(TAG, "上传成功。。。。。。。。。。。。。。。");
                    iconStringUrl = icon.getFileUrl();
                    User user = new User();
                    BmobQuery<User> query = new BmobQuery<User>();
                    query.addWhereEqualTo("UserName", name);
                    query.findObjects(new FindListener<User>() {
                        @Override
                        public void done(List<User> list, BmobException e) {
                            if (e == null){
                                for (User user1 : list){
                                    objectId = user1.getObjectId();
                                    Log.w(TAG, "获取id成功"+objectId);
                                }
                                User user2 = new User();
                                user2.setIcon(icon);
                                user2.update(objectId, new UpdateListener() {
                                    @Override
                                    public void done(BmobException e) {
                                        if (e == null){
                                            Toast.makeText(MainActivity.this, "信息更新成功", Toast.LENGTH_SHORT).show();
                                        }else {
                                            Log.w(TAG, "失败"+e.getErrorCode());
                                        }
                                    }
                                });
                            }else {
                                Log.w(TAG, "获取id失败"+e.getErrorCode());
                            }
                        }
                    });

                    try{
                        iconUrl = new URL(iconStringUrl);
                    } catch (IOException e1){
                        e1.printStackTrace();
                    }

                }else {
                    Log.w(TAG, "上传失败。。。。。。。。。。。。。"+e.getErrorCode());
                }
            }
        });
    }

来解释一下:
String imagePath 是我要上传照片的本地存储路径,getExternalCacheDir()是获得当前应用的缓存目录,使用这个目录可以不用申请SD卡访问权限,”/output_image.ipg”表示在缓存目录下的 output_image.jpg 这个图片文件,记得一定要加上“/”,否则这个路径为空。
final BmobFile icon = new BmobFile(new File(imagePath)); Bmob的文件时以file形式存在的,所有我们得以file形式上传,怎么变成file形式上传呢,就是上面那行代码。固定格式吧,记住就好。
有了BmobFile后,接下来就可以将它上传了。
icon.uploadblock(new UploadFileListener() {
@Override
public void done(BmobException e) {}
这就是上传的固定格式。我们可以在done内进行是否上传成功的判断,就是第一个if、else,如果成功,那么e==null,否则,让e打印错误代码,去官网查看错误代码详情。
接下来,如果上传成功:iconStringUrl = icon.getFileUrl(); iconStringUrl是一个string字符串,用来保存icon上传成功后的url地址(如果要下载,必须要此地址,不下载可以不获取),而 icon.getFileUrl() 则是Bmob提供的获取当前上传文件url地址的方法。
其实到现在就已经上传成功了,只不过我们需要把这个文件和用户名对应起来,所以我们需要将其更新到User表内,使之填入当前用户的头像那一列。所以现在开始更新?不,Bmob很蛋疼的一点是得根据ObjectId来更新对应行(我不知道有没有其他方法了。。。),所以在更新前我们需要获取当前user的name,根据这个name去查他的ObjectId,然后根据这个ObjectId来进行更新。
然后查询ObjectId我就不解释了,基本用法而已。
最后更新:
User user2 = new User();
user2.setIcon(icon);
user2.update(objectId, new UpdateListener() {
@Override
public void done(BmobException e) {
if (e == null){
Toast.makeText(MainActivity.this, “信息更新成功”, Toast.LENGTH_SHORT).show();
}else {
Log.w(TAG, “失败”+e.getErrorCode());
}
}
});
当弹出toast的时候说明更新成功,头像文件和我们当前用户对应起来了。现在看起来还是挺简单的,可当时确实很棘手。。。很烦躁。。。而且头很铁,搞了一个下午,就是把它硬搞出来。。。

然后是从Bmob下载:
还是先上代码:

private void refreshSeasonalFoodList(){
        BmobQuery<TableSeasonalFood> query = new BmobQuery<>();
        query.addWhereNotEqualTo("SeasonalName", "空");
        query.findObjects(new FindListener<TableSeasonalFood>() {
            @Override
            public void done(List<TableSeasonalFood> list, BmobException e) {
                if (e == null) {
                    Log.w(TAG, "查表成功");
                    for (TableSeasonalFood tabFood : list) {
                        titles[ListSize] = tabFood.getTitle();
                        describes[ListSize] = tabFood.getDescribe();
                        objectId[ListSize] = tabFood.getObjectId();
                        BmobFile file = tabFood.getImage();
                        imageUrl[ListSize] = file.getFileUrl();

                        Log.w(TAG, titles[ListSize]);
                        Log.w(TAG, describes[ListSize]);
                        Log.w(TAG, objectId[ListSize]);
                        Log.w(TAG, imageUrl[ListSize]);
                        ListSize++;

                        File image = new File(getContext().getExternalCacheDir(), tabFood.getObjectId()+".PNG");
                        String path = getContext().getExternalCacheDir()+"/"+tabFood.getObjectId()+".PNG";
                        Log.w(TAG, path);
                        if (image.exists()){
                            Log.w(TAG, "exists"+ ListSize);
                            Bitmap exitsBitmap = convertToBitmap(path, 250, 200);

                            bitmaps[ListSize-1] = exitsBitmap;

                        }else {
                            try{
                                image.createNewFile();
                                url = new URL(imageUrl[ListSize-1]);
                            }catch (IOException e2){
                                e2.printStackTrace();
                            }
                            //开始下载
                            downloadPic(url, image);
                        }
                    }
                }else {
                    Log.w(TAG, "查询时令错误:"+e.getErrorCode());
                }

                for (int i = 0; i < ListSize; i++){
                    Log.w(TAG, "开始加载数据");
                    SeasonalOne seasonalOne =new SeasonalOne();
                    seasonalOne.setTitle(titles[i]);
                    seasonalOne.setDescribe(describes[i]);
                    seasonalOne.setBitmap(bitmaps[i]);
                    seasonalOnes.add(seasonalOne);
                }
                adapter = new MySeasonalListAdapter(seasonalOnes, getContext());
                mListView.setAdapter(adapter);
                mFreshVIew.setRefreshing(false);
            }
        });
    }

大致说一下吧。。。
query.addWhereNotEqualTo(“SeasonalName”, “空”); 因为bmob没有直接查询全部的数据方法,所以我在表内加了一行SeasonalName 为 “空”的行,查询所有该列不为“空”的数据,即查询了该表的全部数据(这是一波很有灵性的查表)。
查询成功,遍历该表内数据,并把之存放于数组内,最重要的是这两行:
BmobFile file = tabFood.getImage();
imageUrl[ListSize] = file.getFileUrl();
这里的文件列名是 Image,需要用BmobFile类型来接收,然后再获取它的url。
获取到url后就好办了,我先进行判断该文件是否存在,如果存在就将图片转换成Bitmap形式,否则下载(下载需要URL,所以我把URL作为参数传给了下载函数)。
大致的方法就是这样,一些具体的怎么通过URL下载文件,怎么转换为bitmap等自己查资料把。。。

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值