这个问题主要是承接上文,上文说到,需要解析前端传递的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,不要带有前端的标识字段