java - 由于字符串太大而无法获取有效负载(base64 图像)

标签 java android base64

我在 Android 应用程序中使用 Volley 库向 google cloud api 发出 http 请求。我的问题在于我发送的有效负载。 Google 返回 400 错误。如果我手动创建有效负载(json 文件),它就可以正常工作。

我正在创建一个 JSONObject 并将字符串“[BASE64]”放入 imageBytes 中。如果我直接输入 base64 编码的字符串,我在执行 JSONObject.toString() 时就会遇到转义问题。

这是我的代码:

JSONObject payload = new JSONObject();
JSONObject image = new JSONObject();
JSONObject imageBytes = new JSONObject();

imageBytes.put("imageBytes", "[BASE64]");
image.put("image", imageBytes);
payload.put("payload", image);

requestBody = payload.toString().replace("[BASE64]", convert_bitmap(args[0]));

private String convert_bitmap(Bitmap bitmap){
    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, byteArrayOutputStream);
    byte[] byteArray = byteArrayOutputStream.toByteArray();
    return Base64.encodeToString(byteArray, Base64.DEFAULT);
}

我还尝试加载示例有效负载文件并将 [BASE64] 替换为我的 base64 字符串,得到相同的结果。唯一有效的方法是直接在

中添加 Base64 编码图像
imageBytes.put("imageBytes", "/9j/4AAQSkZJRgA...");

但前提是图像非常小。当我在那里放置一个大字符串时,出现编译器错误(字符串太长)。 我还尝试将请求发送到我的服务器并保存它,以便查看工作服务器和我的服务器之间的差异。我唯一注意到的是,在非工作示例中,行长度较短:

{"payload":{"image":{"imageBytes":"/9j/4AAQSkZJRgABAQAAAQABAAD/4gIoSUNDX1BST0ZJTEUAAQEAAAIYAAAAAAIQAABtbnRyUkdC
IFhZWiAAAAAAAAAAAAAAAABhY3NwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAA9tYAAQAA
AADTLQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlk
ZXNjAAAA8AAAAHRyWFlaAAABZAAAABRnWFlaAAABeAAAABRiWFlaAAABjAAAABRyVFJDAAABoAAA..."}}}

和工作中的:

{"payload":{"image":{"imageBytes":"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..."}}}

恢复:当我将 Base64 编码图像直接添加到 json 文件中时,我可以让它工作。此外,当我将一个非常小的图像文件转换为 Base64 并将字符串直接放入我的代码中时,它就可以工作了。但是,当处理普通图像(用手机等拍摄的照片)并将 Base64 编码的字符串放入 imageBytes 字段时,由于转义问题(toString() 似乎在转换 JSONObject 时添加斜杠)并替换类似 [BASE64] 的内容,它将无法工作由于换行符或字符串长度限制,我的字符串也不起作用。我预计我的问题就在这里,但无法解决。

最佳答案

天哪...我已经解决了!解决方案是使用 Base64.NO_WRAP 标志。 正如我在发布问题时已经想到的那样,问题是转换为 base64 时添加的换行符。

关于java - 由于字符串太大而无法获取有效负载(base64 图像),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55322238/

相关文章:

java - 谷歌地图自动完成安卓

java - 跨多个 Web 服务的交易

java - 当我将监听器传递给异步任务时出现类转换错误

android - 谁提供 PackageManager 类的实现?

ios - Base64 图像编码 Swift 4 iOS

java - 日历类问题

java - 如何在同一个模拟类中 stub 所有方法

android - 由于缺少 Open Mobile API 共享库,应用安装失败

image - Coldfusion 拒绝解码 Base64 图像

javascript - 想要将canvas转换为base64图像