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

Android中用HttpURLConnection调用ImgBB API传图遇400错误求助

问题原因与修复方案

核心问题:请求格式不兼容

ImgBB的/1/upload接口不支持application/json格式的请求体,你当前的代码用JSON传递image参数,导致API无法解析出上传源,因此返回Empty upload source错误。该接口仅接受application/x-www-form-urlencoded或multipart/form-data格式的请求。

修复步骤

1. 修正Bitmap转Base64的逻辑

确保生成的Base64字符串格式正确,不含多余前缀(或保留标准前缀均可,ImgBB两种都支持):

private String bitmapToBase64(Bitmap bitmap) {
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    // 根据图片类型选择压缩格式,比如JPEG/PNG
    bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream);
    byte[] imageBytes = outputStream.toByteArray();
    return Base64.encodeToString(imageBytes, Base64.DEFAULT);
}

2. 修改上传请求的格式

将请求头改为application/x-www-form-urlencoded,并以表单形式传递参数,而非JSON:

上传方法修改

public JsonObject uploadImage(Bitmap bitmap) throws IOException, ExecutionException, InterruptedException {
    String base64Image = bitmapToBase64(bitmap);
    // 对Base64字符串进行URL编码,避免特殊字符导致解析失败
    String formData = "image=" + URLEncoder.encode(base64Image, StandardCharsets.UTF_8.name());
    return new Requests().execute(formData).get();
}

Requests类重构

public class Requests extends AsyncTask<String, Void, JsonObject> {
    @Override
    protected JsonObject doInBackground(String... params) {
        HttpURLConnection connection = null;
        BufferedReader reader = null;
        try {
            URL url = new URL("https://api.imgbb.com/1/upload?key=API_KEY&expiration=300");
            connection = (HttpURLConnection) url.openConnection();
            
            connection.setRequestMethod("POST");
            connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            connection.setDoOutput(true);

            // 写入表单数据
            OutputStream os = connection.getOutputStream();
            os.write(params[0].getBytes(StandardCharsets.UTF_8));
            os.flush();
            os.close();

            // 根据响应码选择输入流(处理成功/错误响应)
            InputStream inputStream = connection.getResponseCode() >= 200 && connection.getResponseCode() < 300
                    ? connection.getInputStream()
                    : connection.getErrorStream();

            StringBuilder responseBuilder = new StringBuilder();
            reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8));
            String line;
            while ((line = reader.readLine()) != null) {
                responseBuilder.append(line);
            }

            return new GsonBuilder().create().fromJson(responseBuilder.toString(), JsonObject.class);

        } catch (IOException e) {
            e.printStackTrace();
            return null;
        } finally {
            if (reader != null) {
                try { reader.close(); } catch (IOException ignored) {}
            }
            if (connection != null) {
                connection.disconnect();
            }
        }
    }
}

额外排查方向

  • 验证API_KEY的正确性:确认密钥没有拼写错误,且属于有效的ImgBB账户
  • 检查图片大小:免费版ImgBB限制单张图片最大3MB,超过会返回其他错误,但当前报错优先排查格式问题
  • 手动验证Base64字符串:将生成的Base64复制到Base64图片在线解码工具,确认能正常显示图片,排除编码错误

内容的提问来源于stack exchange,提问作者Spongerooski

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 11:12:25