我正在使用 Retrofit v.2.2.0 将图片上传到我的服务器,但服务器返回一个空值,表示尚未上传图像。日志显示图片已上传,上传时文件名正确。在邮递员中它仍然有效,这可能是什么问题?
上传个人资料图片.java
public class UploadProfilePicture extends ContextWrapper {
private GetOnUpload onUpload;
private File imageFile,filesDir,file;
private Uri fileUri;
private String profilePic = "profile_pic";
private String fileName;
private ParcelFileDescriptor parcelFileDescriptor;
private FileDescriptor fileDescriptor;
private Bitmap profileImage;
private OutputStream os;
private OkHttpLogClientAPI okHttpLogClientAPI;
private GetOnUpload mInterfaceService;
public UploadProfilePicture(Context base) {
super(base);
okHttpLogClientAPI = new OkHttpLogClientAPI(getBaseContext());
mInterfaceService = okHttpLogClientAPI.logger().create(GetOnUpload.class);
}
public void uploadPic(Uri fileUri,String fileName, final OnSetUploadProfilePic setOnUpload) {
//Build Req estBodies for the map object and a MultipartBody.Part to encapsulate the prof_pic_drawer
this.fileUri = fileUri;
this.fileName = fileName;
try {
getBitmapFromUri();
} catch (IOException e) {
e.printStackTrace();
}
file = persistImage();
RequestBody finalRequestBody = builder.build();
RequestBody requestFile =
RequestBody.create(MediaType.parse("multipart/form-data"), getBytesFromBitmap(profileImage));
// MultipartBody.Part is used to send also the actual file name
MultipartBody.Part body =
MultipartBody.Part.createFormData("file", "avatar.jpg", requestFile);
Call<ResponseUserModel> call = mInterfaceService.upload(body);
call.enqueue(new Callback<ResponseUserModel>() {
@Override
public void onResponse(Call<Response> call, Response<Response> response) {
if (response.isSuccessful()) {
setOnUpload.uploadMessage(response.body());
} else {
Toast.makeText(getBaseContext(), getString(R.string.failed_to_upload), Toast.LENGTH_SHORT).show();
}
}
@Override
public void onFailure(Call<Response> call, Throwable t) {
Toast.makeText(getBaseContext(), getString(R.string.failed_to_upload), Toast.LENGTH_SHORT).show();
}
});
}
}
public static byte[] getBytesFromBitmap(Bitmap bitmap) {
if (bitmap!=null) {
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 70, stream);
return stream.toByteArray();
}
return null;
}
private MultipartBody.Part prepareFilePart() {
//TODO: Use FileUtils to get the actual file by uri
try {
getBitmapFromUri();
file = persistImage();
} catch (IOException e) {
e.printStackTrace();
}
try {
RequestBody requestFile = RequestBody.create(
MediaType.parse(getBaseContext().getContentResolver().getType(fileUri)), file);
return MultipartBody.Part.createFormData("file", file.getName(), requestFile);
} catch (NullPointerException e) {
Toast.makeText(getBaseContext(), "" + e.getMessage(), Toast.LENGTH_SHORT).show();
return null;
}
}
private RequestBody createPartFromString(String descriptionString) {
return RequestBody.create(MultipartBody.FORM, descriptionString);
}
private void getBitmapFromUri() throws IOException {
profileImage = MediaStore.Images.Media.getBitmap(this.getContentResolver(), fileUri);
}
private File persistImage() {
filesDir = getFilesDir();
imageFile = new File(filesDir, fileName + ".jpg");
OutputStream os;
try {
os = new FileOutputStream(imageFile);
profileImage.compress(Bitmap.CompressFormat.JPEG, 70, os);
os.flush();
os.close();
} catch (Exception e) {
Log.e(getClass().getSimpleName(), "Error writing bitmap", e);
}
return imageFile;
}}
GetOnUpload.java
public interface GetOnUpload {
@Multipart
@POST(Constants.UPLOAD_URL)
Call<Response> upload(@Part MultipartBody.Part file);}
Log
http://local.com/api/v1/avatar http://local.com/api/v1/avatarhttp/1.1
11-14 18:40:02.742 8851-9593/com.local.test D/OkHttp:内容类型:多部分/表单数据;边界=d43da080-f2c3-4743-8cfd-9526cc0bd2f7
11-14 18:40:02.742 8851-9593/com.local.test D/OkHttp: 内容长度: 12424
11-14 18:40:02.743 8851-9593/com.local.test D/OkHttp: --d43da080-f2c3-4743-8cfd-9526cc0bd2f7
11-14 18:40:02.743 8851-9593/com.local.test D/OkHttp:内容处置:表单数据;名称=“文件”;文件名=“头像.jpg”
11-14 18:40:02.743 8851-9593/com.local.test D/OkHttp:内容类型:多部分/表单数据
11-14 18:40:02.743 8851-9593/com.local.test D/OkHttp: 内容长度: 12201
11-14 18:40:02.743 8851-9593/com.local.test D/OkHttp:
11-14 18:40:02.744 8851-9593/com.local.test D/OkHttp: --d43da080-f2c3-4743-8cfd-9526cc0bd2f7--
11-14 18:40:02.744 8851-9593/com.local.test D/OkHttp: --> END POST (12424 字节正文)
11-14 18:40:03.332 8851-9593/com.local.test D/OkHttp: http://local.com/api/v1/avatar(587 毫秒)
11-14 18:40:03.332 8851-9593/com.local.test D/OkHttp: 服务器: nginx/1.10.3 (Ubuntu)
11-14 18:40:03.332 8851-9593/com.local.test D/OkHttp: 内容类型: application/json
11-14 18:40:03.332 8851-9593/com.local.test D/OkHttp:传输编码:分块
11-14 18:40:03.332 8851-9593/com.local.test D/OkHttp:连接:保持活动状态
11-14 18:40:03.332 8851-9593/com.local.test D/OkHttp:缓存控制:无缓存,私有
11-14 18:40:03.332 8851-9593/com.local.test D/OkHttp: 日期: 2017 年 11 月 14 日星期二 15:40:03 GMT
11-14 18:40:03.332 8851-9593/com.local.test D/OkHttp: X-RateLimit-Limit: 60
11-14 18:40:03.332 8851-9593/com.local.test D/OkHttp: X-RateLimit-剩余: 59
11-14 18:40:03.333 8851-9593/com.local.test D/OkHttp: {"user":"失败","status":"图片文件未上传"}