• Base64Encoder和Base64Decoder问题解决


    • 场景:前端base64图片内容传到后端,通过BASE64Decoder将图片Base64码转成上传流,上传成功后。更新jenkins时,更新失败。
    • 问题:Java 9版本之后Base64Encoder和Base64Decoder无法继续使用?使用jenkins打包更新时无法使用BASE64Decoder的包(sun.misc.Base64Encoder和sun.misc.Base64Decoder无法使用)?
    • 原因:JDK中的/lib/tool.jar和/lib/rt.jar已经从Java SE 9中删除。
    • 改前:
      import java.io.ByteArrayInputStream;
      import java.io.File;
      import java.io.FileOutputStream;
      import java.io.IOException;
      import java.io.InputStream;
      import org.springframework.web.multipart.MultipartFile;
      import sun.misc.BASE64Decoder;
      import sun.misc.BASE64Encoder;
      /**
       * 图片上传工具类
       */
      public class Base64 implements MultipartFile {
      
          private final byte[] imgContent;
          private final String header;
      
          public Base64(byte[] imgContent, String header) {
              this.imgContent = imgContent;
              this.header = header.split(";")[0];
          }
      
          @Override
          public String getName() {
              // TODO - implementation depends on your requirements
              return System.currentTimeMillis() + Math.random() + "." + header.split("/")[1];
          }
      
          @Override
          public String getOriginalFilename() {
              // TODO - implementation depends on your requirements
              return System.currentTimeMillis() + (int) Math.random() * 10000 + "." + header.split("/")[1];
          }
      
          @Override
          public String getContentType() {
              // TODO - implementation depends on your requirements
              return header.split(":")[1];
          }
      
          @Override
          public boolean isEmpty() {
              return imgContent == null || imgContent.length == 0;
          }
      
          @Override
          public long getSize() {
              return imgContent.length;
          }
      
          @Override
          public byte[] getBytes() throws IOException {
              return imgContent;
          }
      
          @Override
          public InputStream getInputStream() throws IOException {
              return new ByteArrayInputStream(imgContent);
          }
      
          @Override
          public void transferTo(File dest) throws IOException, IllegalStateException {
              new FileOutputStream(dest).write(imgContent);
          }
      
          /**
           * 将图片Base64 码转成上传流
           */
          public static MultipartFile base64ToMultipart(String base64) {
              try {
                  String[] baseStrs = base64.split(",");
      
                  BASE64Decoder decoder = new BASE64Decoder();
                  byte[] b = new byte[0];
                  b = decoder.decodeBuffer(baseStrs[1]);
      
                  for (int i = 0; i < b.length; ++i) {
                      if (b[i] < 0) {
                          b[i] += 256;
                      }
                  }
                  return new Base64(b, baseStrs[0]);
              } catch (IOException e) {
                  e.printStackTrace();
                  return null;
              }
          }
      }
    • 改后:
      import org.springframework.web.multipart.MultipartFile;
      import java.util.Base64;
      import java.util.Base64.Decoder;
      import java.io.*;
      /**
       * 图片上传工具类
       */
      public class Base64Util implements MultipartFile {
      
          private final byte[] imgContent;
          private final String header;
      
          public Base64Util(byte[] imgContent, String header) {
              this.imgContent = imgContent;
              this.header = header.split(";")[0];
          }
      
          @Override
          public String getName() {
              // TODO - implementation depends on your requirements
              return System.currentTimeMillis() + Math.random() + "." + header.split("/")[1];
          }
      
          @Override
          public String getOriginalFilename() {
              // TODO - implementation depends on your requirements
              return System.currentTimeMillis() + (int) Math.random() * 10000 + "." + header.split("/")[1];
          }
      
          @Override
          public String getContentType() {
              // TODO - implementation depends on your requirements
              return header.split(":")[1];
          }
      
          @Override
          public boolean isEmpty() {
              return imgContent == null || imgContent.length == 0;
          }
      
          @Override
          public long getSize() {
              return imgContent.length;
          }
      
          @Override
          public byte[] getBytes() throws IOException {
              return imgContent;
          }
      
          @Override
          public InputStream getInputStream() throws IOException {
              return new ByteArrayInputStream(imgContent);
          }
      
          @Override
          public void transferTo(File dest) throws IOException, IllegalStateException {
              new FileOutputStream(dest).write(imgContent);
          }
      
          /**
           * 将图片Base64 码转成上传流
           */
          public static MultipartFile base64ToMultipart(String base64) {
              String[] baseStrs = base64.split(",");
              String imgBase64 = base64.replaceAll("data:image/png;base64,","");
              Decoder decoder = Base64.getDecoder();
              byte[] result = decoder.decode(imgBase64);
              return new Base64Util(result, baseStrs[0]);
          }
      }
    • 参考:https://blog.csdn.net/xie_sining/article/details/80777164
  • 相关阅读:
    重构原则
    【重构:改善既有代码的设计】读书笔记——开篇
    C#值参数和引用参数
    使用Aspose.Cells利用模板导出Excel(C#)
    在MVC中使用rdlc格式的报表
    程序员如何高效学习
    IT 圈里有哪些经常被读错的词?
    VS2017生成解决方案报错,提示对路径的访问被拒绝
    JavaScript中的数值转换
    Xadmin的配置及使用
  • 原文地址:https://www.cnblogs.com/LJing21/p/12156142.html
Copyright © 2020-2023  润新知