开发者社区 问答 正文

android上传图片报NonRepeatableRequestException

版本号是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)

展开
收起
巭奥特曼 2015-03-19 16:50:21 8286 分享 版权
阿里云 AI 助理回答

这个错误信息表明在尝试重新发送HTTP请求时遇到了问题,具体原因是请求实体(Request Entity)是非可重复的(non-repeatable)。在使用Apache HttpClient库进行网络通信时,如果请求体不支持多次读取(例如,一个来自ByteArrayOutputStream的InputStream),并且请求需要重试(比如因为网络不稳定或服务器要求重试),就会抛出NonRepeatableRequestException

针对你的情况,这是在使用阿里云对象存储服务OSS上传图片时发生的。为了解决这个问题,你可以尝试以下几种方法:

  1. 更新SDK版本:首先确认你使用的阿里云OSS SDK是否为最新版本。老版本的SDK可能没有处理好这种非可重复读取的问题,而新版本可能已经对此进行了优化。访问阿里云官方文档或Maven仓库检查并更新至最新版本的SDK。

  2. 使用FileUploadTask替代:如果你的项目允许,可以考虑将Bitmap先保存到本地文件,然后使用OSS的FileUploadTask来上传文件。这样可以避免直接操作字节数组导致的非可重复读取问题。

  3. 自定义RequestBody:如果你坚持要直接使用字节数组上传,可以尝试创建一个支持多次读取的HttpEntityRequestBody。在OkHttp中,可以通过实现okhttp3.RequestBody接口来创建一个可重复读的请求体,但请注意这需要对网络请求库有较深的理解。

  4. 一次性读取策略:确保你的请求逻辑中,数据流只被读取一次。有时候,即使数据是可重复读的,错误的代码逻辑也可能导致此异常。在你的场景中,由于你已经将Bitmap转换为字节数组,理论上应该是可重复的,所以重点检查是否有其他部分的代码意外地再次尝试读取或修改了这个字节数组。

  5. 查看网络环境:虽然直接原因不是网络,但是不良的网络条件可能会触发某些重试机制,间接导致此问题。确保测试在稳定网络环境下进行。

请根据实际情况选择合适的解决方式,并注意排查是否有其他潜在的代码逻辑问题。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答