java.lang.IllegalArgumentException:非法的base64字符-1

时间:2019-12-11 07:52:37

标签: java android arrays base64

我正在通过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

  • 问题1:我在做什么错了?
  • 问题2:是在REST Service中发送byte []的正确方法吗?

到目前为止,我看到的问答如下:

2 个答案:

答案 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==