我看到各种各样的人都遇到了这个问题。我使用retrofit 2.0.0 beta 2库。在我的Android应用程序中,我想要一张个人资料图片(所以我有动作上传新图像并查看个人资料(带图片)。 我的服务器是ASP.NET Web API。
我一直在阅读很多内容,到目前为止我能够上传图像(不确定是否正确,但似乎是)。当我试图从服务器获取图像以显示它时,我遇到了问题,我从服务器得到答案,但是当我尝试将字节数组转换为位图时,我得到了null结果。
这是我的代码,你可以查看一下:
android方面(改造方法)
@POST("UserProfile/Upload")
Call<ResponseBody> UpdateImage(@Body RequestBody file);
@GET("UserProfile/GetUserImage")
Call<ResponseBody> GetUserImage();
使用这些方法:
private void getProfilePic(){
Call<ResponseBody> call = service.GetUserImage();
call.enqueue(new CustomCallback<ResponseBody>(getActivity())
{
@Override
public void onResponse(Response<ResponseBody> response, Retrofit retrofit)
{
if (response.isSuccess()) {
if (response.body() != null) {
Bitmap bm = null;
try
{
bm = BitmapFactory.decodeStream(response.body().byteStream());
} catch (IOException e)
{
e.printStackTrace();
}
profilePic.setImageBitmap(bm);
dialog.dismiss();
} else {
// TODO
}
} else {
// TODO
}
}
@Override
public void onFailure(Throwable t)
{
super.onFailure(t);
}
});
public void onCropImageClick(View view) {
Bitmap cropped = mCropImageView.getCroppedImage(100, 100);
if (cropped != null)
{
showLoadingDialog();
ByteArrayOutputStream stream = new ByteArrayOutputStream();
cropped.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] byteArray = stream.toByteArray();
RequestBody requestBody = RequestBody
.create(MediaType.parse("application/octet-stream"), byteArray);
Call<ResponseBody> call = service.UpdateImage(requestBody);
call.enqueue(new CustomCallback<ResponseBody>(this) {
@Override
public void onSuccess(ResponseBody model)
{
dialog.dismiss();
finish();
}
@Override
public void onFailure(Throwable t) {
super.onFailure(t);
}
});
}
}
web api服务器端:
[Authorize]
[Route("GetUserImage")]
[HttpGet]
public async Task<IHttpActionResult> GetUserImage()
{
string username = User.Identity.Name;
Player player = await _service.FindPlayer(username);
if (player == null)
return BadRequest();
return Ok(player.UserImage);
}
[Authorize]
[HttpPost]
[Route("Upload")]
public async Task<IHttpActionResult> Upload([NakedBody]byte[] file)
{
return await _service.TryUpdateProfilePicture(file, User.Identity.Name) ? (IHttpActionResult)Ok() : BadRequest();
}
public async Task<bool> TryUpdateProfilePicture(byte[] file, string username)
{
try
{
var player = await FindPlayer(username);
player.UserImage = file;
_unitOfWork.Save();
return true;
}
catch (DbEntityValidationException e)
{
return false;
}
}
我意识到:当我尝试将位图(byte [])发送到服务器时,它返回成功并存储在数据库中。当我尝试从服务器获取它时,我获得了成功响应,并且我有一些字节数组但是当我尝试将其转换为位图时,我得到了null对象。另外,正如我在下面的评论部分中所写,当我从服务器获取字节时,我得到的字节数比我发送给服务器的字节长,这可能很奇怪,但我不知道。