OkHttp3 图片上传 unexpected end of stream的解决

首先是介绍下图片上传

private void request() {
    //这里服务器有问题
    RequestBody requestBody = new MultipartBody.Builder()
            .setType(MultipartBody.FORM)
            .addFormDataPart("userId", userId + "")
            .addFormDataPart("file", "xbh.jpg",
                    RequestBody.create(MediaType.parse("text/x-markdown;charset=utf-8"), file))
            .build();
    Request request = new Request.Builder()
            .url("http://118.25.20.88/api/user/upload/face")
            .post(requestBody)
            .build();
    new OkHttpClient()
            .newCall(request)
            .enqueue(new Callback() {
                @Override
                public void onFailure(@NonNull Call call, @NonNull IOException e) {
                    Log.i(TAG, e.getMessage());
                    detecterActivity.setResult(-1);
                }

                @Override
                public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
                    Log.i(TAG, response.body().string());
                }
            });
}

标准的图片上传代码


但是报了这样一个错

unexpected end of stream


这里不同的人有不同的错误原因和解决方法,我这里讲一下我的

错误原因:我对图片进行了一个YUV byte转jpeg byte以及图像旋转的解码,但是这两个算法会引起Camera的卡顿,所以我选择了开启子线程进行解码。

所以大致代码如下:

File file = null;

子线程{解码图片,得到file}

return file;

这样显然是错的,因为子线程才处理解码到一小半,这个时候我就强制要求返回了,这到问题不大,因为file引用已经成功地指向了子线程中的new出来的file。但是我立马就拿着这个file去进行网络请求了,所以才会报了unexpected end of stream的错。因为这是个半成品file,没有出现他期望的文件封尾。

解决手段:不再使用子线程

思路共鸣:有些人发现几秒钟后,就可以成功的上传图片。这种情况可以注意,是否因为哪里有一些隐蔽的子线程问题,造成file没有这么迅速的到位,只是个正在转换中的半成品。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值