使用Base64实现文件编码和上传
在开发上传图片的时候,我们用的是通过post请求。其实还有另外的方式可以实现图片传输。那么如何通过字符串来传输一个图片或者文档呢?就可以用Base64来实现。
流程
输入的,是二进制文件,比如图片、文档等。在经过base64之后,输出的是编码后的字符串。然后我们直接把经过转码后的字符串,放到请求中去就可以了,服务端在接收到之后,可以进行解码,然后就可以还原出这个文件的信息。
原理
把二进制数据,转为字符串,以便于在一些只支持传输文本的通信协议中传输数据。
编码和解码在线网站 https://www.base64decode.org/
解码的代码示例
前端上传图片时,会把图片用base64编码,然后把这个字符串包含在请求中,可以是get请求的url后面,或者是post请求的body里,然后后端接收到,进行解码。
编码示例:
把文件编码为base64字符串的示例:
publicstaticStringfileToBase64(StringfilePath) { if (filePath==null) { returnnull; } byte[] fileContent=newbyte[0]; try{ fileContent=Files.readAllBytes(Paths.get(filePath)); } catch (IOExceptione) { e.printStackTrace(); }Stringresult=Base64.getEncoder().encodeToString(fileContent); returnresult; }
使用示例:
String base64String =Base64Service.fileToBase64("/Users/didi/Desktop/my.jpg");
解码代码示例:
/**描述:Base64Service*/publicclassBase64Service{ publicstaticvoidmain(String[] args) { Base64Service.base64Tolmage(“ROIGODIhAQABAIAAAAUEBAAAACWAAAAAAQABAAACAKQBADs="); } publicstaticBooleanbase64Tolmage(Stringbase64String){ booleanempty=StringUtils.isEmpty(base64String); if (empty){ returnfalse; } byte[] decode=Base64.getDecoder().decode(base64String); try (OutputStreamstream=newFileOutputStream("/Users/apple/Desktop/my.jpg")){ stream.write(decode); returntrue; } catch (FileNotFounndExceptione){ e.printStackTrace(); returnfalse; } catch (IOExceptione) { e.printStackTrace(); returnfalse; } } }
在这个示例中,“ROIGODIhAQABAIAAAAUEBAAAACwAAAAAAQABAAACAkQBADs=”代表一个1像素的黑色图片,然后我们通过Base64.getDecoder(), decode(base64String)把它进行解码,并写入到文件。
注意事项
只适用于小文件,使用base64传文件的优先级,低于平常的上传文件的方法,所以仅在必要时使用。