我正在通过Android应用程序以编码字符串的形式发送 byte [] 。他们转换我的 byte [] 的方式如下(基本byte []是指图扫描/手指扫描图像): Android
byte[] imageData = m_left_enrollment_fmd(); // returns byte[] which is OK!
// Base64 belongs to android.util package
String forJson = Base64.encodeToString(imageData , Base64.DEFAULT);
这就是我在服务器端( Java )上对其进行解码的方式:
// Base64 belongs to java.util package
byte[] imageData = Base64.getDecoder().decode(sqlJsonParams.optString("IMAGE_DATA"));
它会产生以下异常:
]] ServletException的根本原因。 java.lang.IllegalArgumentException:非法的base64字符-1 在java.util.Base64 $ Decoder.decode0(Base64.java:714) 在java.util.Base64 $ Decoder.decode(Base64.java:526) 在java.util.Base64 $ Decoder.decode(Base64.java:549) 在org.skm.webresources.mobilehis.v2.Fingerprint.getByteArray(Fingerprint.java:470) 在org.skm.webresources.mobilehis.v2.Fingerprint.postFingerprint(Fingerprint.java:86) 被截断了。请参阅日志文件以获取完整的stacktrace
到目前为止,我看到的问答如下:
答案 0 :(得分:0)
我已分批发送图像,也许会有所帮助:
ArrayList<MultipartBody.Part> list = new ArrayList<>();
File photo = new File(image_uri);
RequestBody file = RequestBody.create(MediaType.parse(getMimeType(photo.getAbsolutePath())), photo);
MultipartBody.Part partImage = MultipartBody.Part.createFormData("image", photo.getName(), file);
list.add(partImage);
Call<Void> call = api.uploadMyImage(agreement, list, "@");
getMimeType():
public static String getMimeType(String url) {
String type = null;
String extension = MimeTypeMap.getFileExtensionFromUrl(url);
if (extension != null){
type = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);
}
return type;
}
到Base64:
public static String convertToBase64(String path) {
Bitmap bm = BitmapFactory.decodeFile(path);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bm.compress(Bitmap.CompressFormat.PNG, 100, baos);
byte[] byteArrayImage = baos.toByteArray();
String encodedImage = android.util.Base64.encodeToString(byteArrayImage, android.util.Base64.DEFAULT);
return encodedImage;
}
答案 1 :(得分:0)
我也遇到了这个问题。从Android和Java的base64 API来看,它们都遵循RFC 2045,但是Java的版本也遵循RFC 4846,这有一个小小的收获:
MIME [4]通常用作base 64编码的参考。 但是,MIME本身并未定义“ base 64”,而是“ base” 在MIME中使用“ 64 Content-Transfer-Encoding”。因此,MIME 强制将基本64位编码数据的行长限制为76 字符。 MIME从隐私增强邮件继承了编码 (PEM)[3],指出它“实际上是相同的”;但是,PEM 使用64个字符的行长。 MIME和PEM限制为 两者都是由于SMTP内的限制。
实现不得将换行符添加到基本编码的数据中,除非 参考该文档的规范明确指示了基础
编码器以在特定数量的字符后添加换行符。
您的Android的base64编码器 正在以76个字符作为换行符,而Java的编码器则根本没有换行符。在Android方面处理此问题的方法是使用no_wrap选项,然后您的Java服务器可以读取它:
String forJson = Base64.encodeToString(imageData , Base64.NO_WRAP);
现在,它将正常显示。这是选项Base64.DEFAULT的输出:
ZI4069Ue3D5Ikbp93eJ/r6HQG3CPj3FxGE1SoywcgCuaJ0t5M/D79utSyF1Uf7C7NHdQ9fGuHQ2P\nJnNpsHAEpA==
相对于Base64.NO_WRAP的输出:
ZI4069Ue3D5Ikbp93eJ/r6HQG3CPj3FxGE1SoywcgCuaJ0t5M/D79utSyF1Uf7C7NHdQ9fGuHQ2PJnNpsHAEpA==