版本号是0.3.0
代码很简单:
ByteArrayOutputStream baos = new ByteArrayOutputStream();
chosedPicBitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
byte[] bytes = baos.toByteArray();
OSSBucket bucket = new OSSBucket("xxxxxxx");
OSSData ossData = new OSSData(bucket, "android_upload.jpg");
ossData.setData(bytes, "image/jpg");
ossData.uploadInBackground(new SaveCallback() {
@Override
public void onSuccess(String s) {
ToastUtil.showBottomToast("success");
}
@Override
public void onProgress(String s, int i, int i2) {
}
@Override
public void onFailure(String s, OSSException e) {
}
});
报错信息:
org.apache.http.client.ClientProtocolException
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:557)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
at com.aliyun.mbaas.oss.storage.OSSAsyncTask.run(OSSAsyncTask.java:187)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:841)
Caused by: org.apache.http.client.NonRepeatableRequestException: Cannot retry request with a non-repeatable request entity
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:420)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
这个错误信息表明在尝试重新发送HTTP请求时遇到了问题,具体原因是请求实体(Request Entity)是非可重复的(non-repeatable)。在使用Apache HttpClient库进行网络通信时,如果请求体不支持多次读取(例如,一个来自ByteArrayOutputStream的InputStream),并且请求需要重试(比如因为网络不稳定或服务器要求重试),就会抛出NonRepeatableRequestException。
针对你的情况,这是在使用阿里云对象存储服务OSS上传图片时发生的。为了解决这个问题,你可以尝试以下几种方法:
更新SDK版本:首先确认你使用的阿里云OSS SDK是否为最新版本。老版本的SDK可能没有处理好这种非可重复读取的问题,而新版本可能已经对此进行了优化。访问阿里云官方文档或Maven仓库检查并更新至最新版本的SDK。
使用FileUploadTask替代:如果你的项目允许,可以考虑将Bitmap先保存到本地文件,然后使用OSS的FileUploadTask来上传文件。这样可以避免直接操作字节数组导致的非可重复读取问题。
自定义RequestBody:如果你坚持要直接使用字节数组上传,可以尝试创建一个支持多次读取的HttpEntity或RequestBody。在OkHttp中,可以通过实现okhttp3.RequestBody接口来创建一个可重复读的请求体,但请注意这需要对网络请求库有较深的理解。
一次性读取策略:确保你的请求逻辑中,数据流只被读取一次。有时候,即使数据是可重复读的,错误的代码逻辑也可能导致此异常。在你的场景中,由于你已经将Bitmap转换为字节数组,理论上应该是可重复的,所以重点检查是否有其他部分的代码意外地再次尝试读取或修改了这个字节数组。
查看网络环境:虽然直接原因不是网络,但是不良的网络条件可能会触发某些重试机制,间接导致此问题。确保测试在稳定网络环境下进行。
请根据实际情况选择合适的解决方式,并注意排查是否有其他潜在的代码逻辑问题。