由于字符串太大,无法获得有效的有效载荷(base64图像)

时间:2019-03-24 09:12:32

标签: 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]之类的东西,将无法正常工作由于换行或字符串长度限制,我的字符串也不起作用。我希望我的问题就在这里,但无法解决。

1 个答案:

答案 0 :(得分:0)

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