LuckSiege / PictureSelector

Picture Selector Library for Android or 图片选择器
Apache License 2.0
13.23k stars 3k forks source link

博主大大,选择多图的时候,遇到点问题,能否帮忙解答下,万分感谢 #235

Closed 38603678 closed 6 years ago

38603678 commented 6 years ago

使用retrofit 多图上传的时候有几率会出这个错,感觉是随机的,报告路径找不到: /data/data/com.cq.wsj.ecare/cache/picture_cache/1508404062974.png: open failed: ENOENT (No such file or directory)

同样的那几张图,多试几次,有时候能成功,有时候就报这个错,选择的图数量越多越容易报这个错,我在想,1508404062974.png 是压缩后随机取的名字,是不是有时候压缩后的这个文件名有冲突导致的? 权限和目录问题的话应该可以排除吧,因为有时候是可以成功的。也可能是我自己上传的方法有问题,下面是我的相关部分代码:

int num = 0; for (LocalMedia media : list) { //从路径取文件 File file = null; try { file = new File(media.getCompressPath()); } catch (Exception e) { mView.showError("文件为空"); return; }

        // create RequestBody instance from file
        RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), file);
        part = MultipartBody.Part.createFormData("upload", file.getName(), requestFile);
        listPart.add(part);
        listName.add(DateUtil.getDateStr("yyyy-MM-dd") + "-" + num++);
    }

//测试过,到这一步是没有出问题的,listPart的数量也是对的,下面上传的时候就报错了 mView.showLoadingDialog("正在上传..."); Subscription rxSubscription = mRetrofitHelper.uploadPhoto(deviceId, mView.getAlbumId(), listName, listPart)

下面是上传方法:

/**

LuckSiege commented 6 years ago

看错误信息是提示这个文件不存在,你可以查看一下手机是否有这个 路径/data/data/com.cq.wsj.ecare/cache/picture_cache/1508404062974.png,后面这个文件名是根据时间戳生成的不存在重复的情况

LuckSiege commented 6 years ago

建议在media.getCompressPath()的时候判断一下media.isCompress()是否压缩过,没压缩过或压缩失败的图片可以取getPath原图

38603678 commented 6 years ago

博主大大,首先很感谢你的回复!我在手机上没有找到该目录,但是有时候又可以成功上传,同是那9张照片,有时候9张都能成功,有时候6张才能成功,数量不固定,但是2张以下试过的基本每次都能成功。而且每次报错的都是随机的,不是同一张报错。我也加上了你说的判断是否压缩成功: if (media.isCompressed()){ file = new File(media.getCompressPath()); Log.e("IMG", media.getCompressPath()); }else { file = new File(media.getPath()); Log.e("IMG", media.getPath()); } 但是还是报错,而且报错的路径都是压缩路径:

10-23 10:39:37.790 28433-28433/com.cq.wsj.ecare E/IMG: /data/data/com.cq.wsj.ecare/cache/luban_disk_cache/Luban_1508726369703.jpg 10-23 10:39:37.790 28433-28433/com.cq.wsj.ecare E/IMG: /storage/emulated/0/ecare/1507775118818.jpg 10-23 10:39:37.790 28433-28433/com.cq.wsj.ecare E/IMG: /data/data/com.cq.wsj.ecare/cache/luban_disk_cache/Luban_1508726373943.jpg 10-23 10:39:37.795 28433-28433/com.cq.wsj.ecare E/IMG: /data/data/com.cq.wsj.ecare/cache/luban_disk_cache/Luban_1508726374085.jpg 10-23 10:39:37.795 28433-28433/com.cq.wsj.ecare E/IMG: /data/data/com.cq.wsj.ecare/cache/luban_disk_cache/Luban_1508726376499.jpg 10-23 10:39:37.795 28433-28433/com.cq.wsj.ecare E/IMG: /data/data/com.cq.wsj.ecare/cache/luban_disk_cache/Luban_1508726376744.jpg 10-23 10:39:37.795 28433-28433/com.cq.wsj.ecare E/IMG: /data/data/com.cq.wsj.ecare/cache/luban_disk_cache/Luban_1508726376897.jpg 10-23 10:39:37.800 28433-28433/com.cq.wsj.ecare E/IMG: /data/data/com.cq.wsj.ecare/cache/luban_disk_cache/Luban_1508726377143.jpg 10-23 10:39:37.800 28433-28433/com.cq.wsj.ecare E/IMG: /data/data/com.cq.wsj.ecare/cache/luban_disk_cache/Luban_1508726377548.jpg 10-23 10:39:37.800 28433-28433/com.cq.wsj.ecare E/IMG: before upload~~~~~~ 10-23 10:39:38.170 28433-28433/com.cq.wsj.ecare E/IMG: error: /data/data/com.cq.wsj.ecare/cache/luban_disk_cache/Luban_1508726376744.jpg: open failed: ENOENT (No such file or directory)

有点想不明白了,问题出在哪里,是压缩环节出错了吗?但是根据判断media.getCompressPath()是压缩成功了呀,按道理是有那个文件的呀

会不会是我的设置出错了?系统压缩和鲁班压缩我都试过了,下面是我的配置: PictureSelector.create(this) .openGallery(PictureMimeType.ofImage())//全部.PictureMimeType.ofAll()、图片.ofImage()、视频.ofVideo() .maxSelectNum(9)// 最大图片选择数量 int .minSelectNum(1)// 最小选择数量 int .imageSpanCount(4)// 每行显示个数 int .selectionMode(PictureConfig.MULTIPLE)// 多选 or 单选 PictureConfig.MULTIPLE or PictureConfig.SINGLE .previewImage(true)// 是否可预览图片 true or false .previewVideo(false)// 是否可预览视频 true or false .enablePreviewAudio(false) // 是否可播放音频 true or false .isCamera(true)// 是否显示拍照按钮 true or false .isZoomAnim(true)// 图片列表点击 缩放效果 默认true .sizeMultiplier(0.5f)// glide 加载图片大小 0~1之间 如设置 .glideOverride()无效 .setOutputCameraPath("/CustomPath")// 自定义拍照保存路径,可不填 .enableCrop(false)// 是否裁剪 true or false .compress(true)// 是否压缩 true or false .compressMode(PictureConfig.LUBAN_COMPRESS_MODE)//系统自带 or 鲁班压缩 PictureConfig.SYSTEM_COMPRESS_MODE or LUBAN_COMPRESS_MODE .compressGrade(Luban.THIRD_GEAR)// luban压缩档次,默认3档 Luban.THIRD_GEAR、Luban.FIRST_GEAR、Luban.CUSTOM_GEAR .glideOverride(100, 120)// int glide 加载宽高,越小图片列表越流畅,但会影响列表图片浏览的清晰度 .isGif(false)// 是否显示gif图片 true or false .openClickSound(false)// 是否开启点击声音 true or false .previewEggs(true)// 预览图片时 是否增强左右滑动图片体验(图片滑动一半即可看到上一张是否选中) true or false .forResult(PictureConfig.CHOOSE_REQUEST);//结果回调onActivityResult code

LuckSiege commented 6 years ago

看代码是没什么问题,你自己看下demo有没有这个问题吧?或者找下规律

38603678 commented 6 years ago

获取到List后,我自己压缩然后存到 Android/data/com.cq.wsj.ecare/cache 下面,再上传就没有问题了,猜测是压缩存储的环节出了问题?data/data下的app私有存储控件不够了? 总之还是感谢博主的耐心解答,问题总算解决了

LuckSiege commented 6 years ago

你可以压缩上传完后 调用清除缓存的api,应该就没问题了