从后台获取图片的base64格式,直接显示在界面上失败,报base64 unsafe

本文介绍了解决从后台获取的Base64格式图片在前端显示失败的问题,主要是因为数据中包含了空格和换行符。通过使用JavaScript去除这些字符,成功实现了图片的正常显示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近做项目从后台获取图片的base64格式,直接显示在界面上失败,报base64 unsafe,怎么解决:

首先说下原因,原因是后台返回的数据包含有空格和换行,

解决:


  //去除字符串中的空格和换行
  formatString(value) {
    if (value == null || value == "" || value == undefined) {
      return "";
    } else {
      var str = value.replace(/\ +/g, "");
      str = str.replace(/[\r\n]/g, "");
      return str;
    }

  }

<think>根据引用[1][3],`sun.misc.BASE64Encoder`在Java9及以上版本已被移除,导致编译错误。我们需要将代码迁移到Java8引入的标准`java.util.Base64`类。原始代码是一个自定义的`BASE64Encoder`类,继承自`sun.misc.CharacterEncoder`。这个类实现了Base64编码的功能。但是在新版本Java中,我们应该使用`java.util.Base64`提供的编码器。由于原始代码是一个完整的Base64编码器实现,我们可以将其替换为使用标准库的方式。同时,原始代码中有一个`encodeAtom`方法用于处理每3个字节的编码,但标准库已经内置了这些功能。因此,我们可以完全移除这个自定义类,改用`java.util.Base64`。但是,如果项目中有其他地方调用了这个自定义的`BASE64Encoder`类,我们需要修改调用点。###改写步骤1.**删除自定义的`BASE64Encoder`类**:因为标准库已经提供了更好的替代方案。2.**在需要Base64编码的地方使用`java.util.Base64`**。###示例:替换调用点假设原来使用自定义编码器的代码是这样的:```javaBASE64Encoderencoder=newBASE64Encoder();Stringencoded=encoder.encode(data);//假设data是byte[]```现在改为:```javaimportjava.util.Base64;//...Base64.Encoderencoder=Base64.getEncoder();Stringencoded=encoder.encodeToString(data);```###工具类改写参考引用[2]中的工具类,我们可以改写为:```javapackagecom.rabbiter.bms.utils;importjava.util.Base64;importjava.nio.charset.StandardCharsets;publicclassBase64Util{//编码publicstaticStringencode(Stringstr){if(str==null){returnnull;}byte[]bytes=str.getBytes(StandardCharsets.UTF_8);returnBase64.getEncoder().encodeToString(bytes);}//解码publicstaticStringdecode(Stringbase64Str){if(base64Str==null){returnnull;}try{byte[]bytes=Base64.getDecoder().decode(base64Str);returnnewString(bytes,StandardCharsets.UTF_8);}catch(IllegalArgumentExceptione){//处理Base64格式错误e.printStackTrace();returnnull;}}}```###为什么这样改写?1.**使用标准库**:`java.util.Base64`是Java8及以上版本的标准API,稳定且高效。2.**字符集明确**:使用`StandardCharsets.UTF_8`避免平台默认字符集不一致的问题。3.**异常处理**:捕获`IllegalArgumentException`以处理不合法的Base64输入。###注意事项-如果原始代码中使用了自定义的`BASE64Encoder`类,需要将所有使用到的地方替换为新的工具类方法。-如果项目需要兼容Java7或更早版本,可以使用ApacheCommonsCodec库的`Base64`类,但这里我们假设使用Java8及以上。###相关问题1.在迁移旧项目到Java11时,除了Base64,还有哪些常见的`sun.misc`包下的类需要替换?2.使用`java.util.Base64`与第三方Base64库(如ApacheCommonsCodec)相比有什么优势?3.如何确保Base64编码在不同系统(如Android和标准Java)之间的一致性?</think>要将基于 `sun.misc.BASE64Encoder` 的旧代码迁移到 Java 8+ 标准 API 并解决 `encode` 方法无法解析的问题,请按照以下步骤操作: ### 完全重构方案(推荐) ```java package com.rabbiter.bms.utils; import java.util.Base64; public class Base64Utils { // 编码方法 public static String encode(byte[] data) { return Base64.getEncoder().encodeToString(data); } // 编码字符串(自动处理字符集) public static String encode(String text) { return Base64.getEncoder().encodeToString(text.getBytes(java.nio.charset.StandardCharsets.UTF_8)); } // 解码方法 public static byte[] decode(String base64String) { return Base64.getDecoder().decode(base64String); } // 解码为字符串 public static String decodeToString(String base64String) { return new String(Base64.getDecoder().decode(base64String), java.nio.charset.StandardCharsets.UTF_8); } } ``` ### 关键修改说明: 1. **完全移除 `sun.misc` 依赖** - 删除 `import sun.misc.CharacterEncoder;` 和 `extends CharacterEncoder` - 使用标准库 `java.util.Base64` 替代私有 API[^1][^3] 2. **解决 `encode` 方法问题** - 原始代码缺少公共 `encode` 方法 - 新增标准化编码方法: ```java public static String encode(byte[] data) { return Base64.getEncoder().encodeToString(data); } ``` 3. **字符集处理优化** - 使用 `StandardCharsets.UTF_8` 明确字符集 - 避免 `UnsupportedEncodingException` 异常[^2] 4. **功能增强** - 支持字节数组和字符串的双向转换 - 提供四种实用方法: - `encode(byte[])` → Base64 字符串 - `encode(String)` → Base64 字符串 - `decode(String)` → 原始字节数组 - `decodeToString(String)` → 原始字符串 ### 使用示例: ```java // 编码字符串 String original = "Hello BMS!"; String encoded = Base64Utils.encode(original); // 结果: "SGVsbG8gQk1TIQ==" // 解码字符串 String decoded = Base64Utils.decodeToString(encoded); // 结果: "Hello BMS!" // 编码二进制数据 byte[] imageData = Files.readAllBytes(Paths.get("logo.png")); String base64Image = Base64Utils.encode(imageData); ``` ### 迁移注意事项: 1. **兼容性**: - 此方案兼容 **Java 8+** 所有版本 - Java 6/7 需添加依赖: ```xml <!-- pom.xml --> <dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> <version>1.15</version> </dependency> ``` 2. **错误处理**: - 非法 Base64 输入会抛出 `IllegalArgumentException` - 建议添加异常处理: ```java try { return Base64.getDecoder().decode(base64String); } catch (IllegalArgumentException e) { throw new InvalidBase64Exception("无效的Base64输入", e); } ``` 3. **性能优化**: - 处理大文件时使用流式 API: ```java Base64.getEncoder().wrap(outputStream); Base64.getDecoder().wrap(inputStream); ``` ### 相关问题 1. Java 11 模块化系统中,如何为 `java.base` 模块添加必要的导出声明? 2. 除了 Base64,迁移到 Java 11 时还有哪些 `sun.misc` 类需要替换(如 `Unsafe`)? 3. 如何设计兼容 Java 8 和 Java 17 的跨版本构建脚本? 4. Base64 编码在不同编程语言(Python/JavaScript)中的实现差异有哪些需要注意?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值