前几天给app写接口,其中一个接口需要上传图片,以前的接口都是上传的file类型,后台可以直接使用MultipartFile来接收这个文件。这次app的开发说不行不行就不行,必须要上传base64格式,我就在网上找了一下,发现都比较麻烦,最后还是在英文网站上找到了一个比较好的处理方法,程序员还是有必要学学英语的,是个叫Rob Black的哥们写的,也是个秃顶,哎。下面是后端的实现代码。
MultipartFile是spring框架中的接口,主要的实现类都不太适用于base64的上传文件,这里需要自己写一个实现类。代码如下:
public class BASE64DecodedMultipartFile implements MultipartFile { private final byte[] imgContent; private final String header; public BASE64DecodedMultipartFile(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 bytegetBytes() 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); } }
然后再写个工具类:
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 BASE64DecodedMultipartFile(b, baseStrs[0]); } catch (IOException e) { e.printStackTrace(); return null; } }
然后在代码中调用工具类就可以啦