You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Retrofit POST请求的请求体中发送Base64编码的图片

如何在Retrofit POST请求体中发送Base64编码的图片?

我来帮你一步步解决这个问题,结合你已经有的相机回调代码,我们分几个环节来实现:


1. 将Bitmap转换为Base64编码字符串

你已经在onActivityResult里成功拿到了Bitmap对象,接下来需要把它转换成Base64格式的字符串。这里要注意对Bitmap做压缩处理,避免生成的Base64字符串过大导致请求失败或超时。

先写一个工具方法完成转换:

private String bitmapToBase64(Bitmap bitmap) {
    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    // 这里用PNG格式压缩(质量100),如果追求更小体积可以换成JPEG格式,调整质量参数比如50-70
    bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOutputStream);
    byte[] byteArray = byteArrayOutputStream.toByteArray();
    return Base64.encodeToString(byteArray, Base64.DEFAULT);
}

然后在你的onActivityResult回调里调用这个方法,拿到Base64字符串后触发上传逻辑:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == CAMERA_INTENT_REQUEST_CODE && resultCode == RESULT_OK && data != null) {
        try {
            if (data.getData() == null) {
                bitmap = (Bitmap) data.getExtras().get("data");
                resultImage.setImageBitmap(bitmap);
            } else {
                bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), data.getData());
                resultImage.setImageBitmap(bitmap);
            }
            // 转换为Base64字符串
            String base64Image = bitmapToBase64(bitmap);
            // 发起上传请求
            uploadImageToServer(base64Image);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

2. 定义Retrofit的API接口

根据后端接口的参数格式,我们分两种情况定义接口:

情况一:后端接受JSON格式请求体

先创建一个实体类封装请求参数:

public class ImageUploadRequest {
    private String image;

    public ImageUploadRequest(String image) {
        this.image = image;
    }

    // 可选:添加Getter/Setter,Gson会自动处理字段序列化
    public String getImage() {
        return image;
    }
}

然后定义Retrofit接口:

public interface ImageApiService {
    @POST("your-upload-endpoint") // 替换成你的后端上传接口路径
    Call<ResponseBody> uploadImage(@Body ImageUploadRequest request);
}

情况二:后端接受表单格式(application/x-www-form-urlencoded)

直接定义表单参数的接口即可:

public interface ImageApiService {
    @FormUrlEncoded
    @POST("your-upload-endpoint")
    Call<ResponseBody> uploadImage(@Field("image") String base64Image);
}

3. 初始化Retrofit并发起请求

写一个方法完成请求的发起和回调处理:

private void uploadImageToServer(String base64Image) {
    // 初始化Retrofit实例
    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl("your-base-api-url") // 替换成你的后端基础地址
            .addConverterFactory(GsonConverterFactory.create())
            .build();

    ImageApiService apiService = retrofit.create(ImageApiService.class);

    // 根据接口类型选择请求方式
    Call<ResponseBody> call;
    if (你用的是JSON请求体) {
        call = apiService.uploadImage(new ImageUploadRequest(base64Image));
    } else {
        call = apiService.uploadImage(base64Image);
    }

    // 异步发起请求
    call.enqueue(new Callback<ResponseBody>() {
        @Override
        public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
            if (response.isSuccessful()) {
                Toast.makeText(YourActivity.this, "图片上传成功", Toast.LENGTH_SHORT).show();
                // 可以在这里处理后端返回的数据
            } else {
                Toast.makeText(YourActivity.this, "上传失败,错误码:" + response.code(), Toast.LENGTH_SHORT).show();
            }
        }

        @Override
        public void onFailure(Call<ResponseBody> call, Throwable t) {
            t.printStackTrace();
            Toast.makeText(YourActivity.this, "网络请求失败,请检查网络", Toast.LENGTH_SHORT).show();
        }
    });
}

4. 额外注意事项

  • 优化Base64体积:Base64编码会比原文件大30%左右,如果Bitmap尺寸很大,建议先缩放再转换:
    private Bitmap scaleBitmap(Bitmap bitmap, int maxSize) {
        int width = bitmap.getWidth();
        int height = bitmap.getHeight();
        float scale = Math.min((float) maxSize / width, (float) maxSize / height);
        Matrix matrix = new Matrix();
        matrix.postScale(scale, scale);
        return Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true);
    }
    
    转换前调用:Bitmap scaledBitmap = scaleBitmap(bitmap, 800);
  • 权限检查:确保已经申请了相机权限和网络权限,Android 6.0及以上需要动态申请相机权限。

内容的提问来源于stack exchange,提问作者Adarsh Vijayan P

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:36:08