springBoot中base64与文件的相互转换

首页 / 新闻资讯 / 正文

这个问题主要是承接上文,上文说到,需要解析前端传递的base64字符串,转成文件并保存到文件服务器中,这就用到了base64转码等操作。刚开始没当回事觉得很常见,但是做的时候才各种坑。后续大家注意以下提到的点。

首先是base64Util工具类

主要的问题来源于引入jar包的种类,由于虽然本项目依赖于jdk1.8但是也要支持1.7的情况所以jdk1.8类库中的base无法使用。下面上代码。

import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder;  import javax.imageio.stream.FileImageInputStream; import java.io.BufferedOutputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.util.regex.Matcher; import java.util.regex.Pattern;  public class base64Util {      /**      * base64转文件并输出到指定目录      * @param base64Str      * @param fileName      * @param filePath      * @return      */     public static byte[] decode(String base64Str,String fileName,String filePath){         File file = null;         //创建文件目录         File  dir=new File(filePath);         if (!dir.exists() && !dir.isDirectory()) {             dir.mkdirs();         }         BufferedOutputStream bos = null;         java.io.FileOutputStream fos = null;          byte[] b = null;         BASE64Decoder decoder = new BASE64Decoder();         try {             b = decoder.decodeBuffer(replaceEnter(base64Str));             //window             //file=new File(filePath+"\\"+fileName);             //linux             file=new File(filePath+"/"+fileName);             fos = new java.io.FileOutputStream(file);             bos = new BufferedOutputStream(fos);             bos.write(b);         } catch (IOException e) {             e.printStackTrace();         }finally {             if (bos != null) {                 try {                     bos.close();                 } catch (IOException e) {                     e.printStackTrace();                 }             }             if (fos != null) {                 try {                     fos.close();                 } catch (IOException e) {                     e.printStackTrace();                 }             }         }         return b;     }      /**      * 图片转字符串      * @param image      * @return      */     public static String encode(byte[] image){         BASE64Encoder decoder = new BASE64Encoder();         return replaceEnter(decoder.encode(image));     }      public static String encode(String uri){         BASE64Encoder encoder = new BASE64Encoder();         return replaceEnter(encoder.encode(uri.getBytes()));     }      /**      *      * @path    图片路径      * @return      */      public static byte[] imageTobyte(String path){         byte[] data = null;         FileImageInputStream input = null;         try {             input = new FileImageInputStream(new File(path));             ByteArrayOutputStream output = new ByteArrayOutputStream();             byte[] buf = new byte[1024];             int numBytesRead = 0;             while((numBytesRead = input.read(buf)) != -1){                 output.write(buf, 0, numBytesRead);             }             data = output.toByteArray();             output.close();             input.close();          } catch (Exception e) {             e.printStackTrace();         }          return data;     }      public static String replaceEnter(String str){         String reg ="[\n-\r]";         Pattern p = Pattern.compile(reg);         Matcher m = p.matcher(str);         return m.replaceAll("");     }  }

使用:里面的参数大家自己定义哈。

注意:用来转换或者其他操作的的base64字符串一定要是纯粹的base64,不要带有前端的标识字段