首先是介绍下图片上传
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没有这么迅速的到位,只是个正在转换中的半成品。