我正在通过Android应用程序将byte []作为编码字符串发送。我转换我的byte []的方式如下(基本上byte []是thumbscan / fingerscan图像):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
问题1:我做错了什么?
问题2:这是在REST Service中发送byte []的正确方法吗?
到目前为止,我看到的问答如下:
Base 64 encode and decode example code
Base64: java.lang.IllegalArgumentException: Illegal character
Java - decode base64 - Illegal base64 character 1
最佳答案
我已将图像分成多部分发送,这可能会有所帮助:
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;
}