java 文件流 base64_java实现图片文件与Base64的互转

通过form表单上传图片时,有时候web容器对文件大小的限制会影响我们上传。这时,前端页面可以考虑将图片转换成base64串来实现上传。可参见:vue利用canvas将图片上传到服务器

■ 图片与Base64的互转,其实就是利用了文件流与Base64的互转

文件转换成Base64字符串:读取文件的输入流,因为文件流是字节流,所以要放到byte数组(字节数组,byte取值范围-128~127)里,然后对byte数组做Base64编码,返回字符串。

Base64串转换成文件:对Base64编码的字符串进行Base64解码,得到byte数组,利用文件输出流将byte数据写入到文件。

Talk is cheap, show me the code。直接上代码:

importsun.misc.BASE64Decoder;importsun.misc.BASE64Encoder;import java.io.*;public classImageBase64Converter {/*** 本地文件(图片、excel等)转换成Base64字符串

*

*@paramimgPath*/

public staticString convertFileToBase64(String imgPath) {byte[] data = null;//读取图片字节数组

try{

InputStream in= newFileInputStream(imgPath);

System.out.println("文件大小(字节)="+in.available());

data= new byte[in.available()];

in.read(data);

in.close();

}catch(IOException e) {

e.printStackTrace();

}//对字节数组进行Base64编码,得到Base64编码的字符串

BASE64Encoder encoder = newBASE64Encoder();

String base64Str=encoder.encode(data);returnbase64Str;

}/*** 将base64字符串,生成文件*/

public staticFile convertBase64ToFile(String fileBase64String, String filePath, String fileName) {

BufferedOutputStream bos= null;

FileOutputStream fos= null;

File file= null;try{

File dir= newFile(filePath);if (!dir.exists() && dir.isDirectory()) {//判断文件目录是否存在

dir.mkdirs();

}

BASE64Decoder decoder= newBASE64Decoder();byte[] bfile =decoder.decodeBuffer(fileBase64String);

file= new File(filePath + File.separator +fileName);

fos= newFileOutputStream(file);

bos= newBufferedOutputStream(fos);

bos.write(bfile);returnfile;

}catch(Exception e) {

e.printStackTrace();return null;

}finally{if (bos != null) {try{

bos.close();

}catch(IOException e1) {

e1.printStackTrace();

}

}if (fos != null) {try{

fos.close();

}catch(IOException e1) {

e1.printStackTrace();

}

}

}

}

}

testcase:

public static voidmain(String[] args) {

long start =System.currentTimeMillis();

String imgBase64Str= ImageBase64Converter.convertFileToBase64("D:\\Pictures\\科技\\liziqi-李子柒爆红.jpg");//System.out.println("本地图片转换Base64:" + imgBase64Str);

System.out.println("Base64字符串length="+imgBase64Str.length());

ImageBase64Converter.convertBase64ToFile(imgBase64Str,"D:\\Pictures\\科技","test.jpg");

System.out.println("duration:"+(System.currentTimeMillis()-start));

start=System.currentTimeMillis();

String fileBase64Str= ImageBase64Converter.convertFileToBase64("D:\\Pictures\\科技\\PayOrderList200109075516581.xlsx");//System.out.println("本地excel转换Base64:" + fileBase64Str);

System.out.println("Base64字符串length="+fileBase64Str.length());

ImageBase64Converter.convertBase64ToFile(fileBase64Str,"D:\\Pictures\\科技","test.xlsx");

System.out.println("duration:"+(System.currentTimeMillis()-start));

}

执行结果:

文件大小(字节)=2820811Base64字符串length=3860058duration:244文件大小(字节)=25506Base64字符串length=34902duration:10

提醒一下:获取文件的大小是用FileInputStream实例的available()方法哦,用File实例的length()返回的是0。

如下图,测试方法里图片文件“liziqi-李子柒爆红.jpg”的大小正是2820811字节   ÷1024=2755KB  ÷1024=2.68M

ad88a193a4cd83fe8b27c89af7243af3.png

■ Fastdfs工具类中的图片上传

FastdfsClientUtil中关于图片上传,有3个重载方法。

public String uploadImageAndCrtThumbImage(MultipartFile myfile) throws Exception

public String uploadImageAndCrtThumbImageByStream(InputStream inputStream,int size,String fileExtName) throws Exception

public String uploadImageAndCrtThumbImageByBase64(String base64ImgData) throws Exception

在这里,我说一下uploadImageAndCrtThumbImageByBase64这个方法。它的入参是一个base64串。注意这个这个参数的值,在base64串的前头有一个前缀,诸如 "data:image/gif;base64,"、"data:image/jpeg;base64,"。其中gif、jpeg是目标图片文件的扩展名。这正适合于前端页面通过base64串来上传图片的场景。

下面贴出来这个方法的实现,一看便知。

importcom.github.tobato.fastdfs.domain.fdfs.StorePath;importcom.github.tobato.fastdfs.exception.FdfsUnsupportStorePathException;importcom.github.tobato.fastdfs.service.FastFileStorageClient;importorg.apache.commons.lang3.StringUtils;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Component;importorg.springframework.web.multipart.MultipartFile;importsun.misc.BASE64Decoder;importjava.io.ByteArrayInputStream;importjava.io.InputStream;

@Componentpublic classFastdfsClientUtil {private final Logger logger = LoggerFactory.getLogger(FastdfsClientUtil.class);

@AutowiredprivateFastFileStorageClient storageClient;//上传文件并生成缩略图

public String uploadImageAndCrtThumbImageByBase64(String base64ImgData) throwsException {

BASE64Decoder decoder= newBASE64Decoder();

String[] base64ImageSplit= base64ImgData.split(",");byte[] result = decoder.decodeBuffer(base64ImageSplit[1]);//解码

String fileExtName = base64ImageSplit[0].substring(base64ImageSplit[0].indexOf("/")+1,base64ImageSplit[0].indexOf(";"));for (int i = 0; i < result.length; ++i) {if (result[i] < 0) {//调整异常数据

result[i] += 256;

}

}

InputStream inputStream= newByteArrayInputStream(result);returnuploadImageAndCrtThumbImageByStream(inputStream, result.length,fileExtName );

}

}

测试用例:

@Testpublic void uploadPng() throwsException {

String imgBase64="/9j/4AAQSkZJRgABAQEAYABgAAD/7QjCUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA\n" +

"AgBIAAAAAQACOEJJTQQNAAAAAAAEAAAAHjhCSU0EGQAAAAAABAAAAB44QklNA/MAAAAAAAkAAAAA\n" +

"AAAAAAEAOEJJTQQKAAAAAAABAAA4QklNJxAAAAAAAAoAAQAAAAAAAAACOEJJTQP1AAAAAABIAC9m\n" +

"ZgABAGxmZgAGAAAAAAABAC9mZgABAKGZmgAGAAAAAAABADIAAAABAFoAAAAGAAAAAAABADUAAAAB\n" +

"AC0AAAAGAAAAAAABOEJJTQP4AAAAAABwAAD/A+gAAAAA\n" +

"/wPoAAAAAP8D6AAAAAD/\n" +......"0HoaKACg80GjvQISijrmjFMD/9k=";

String fileName= fastdfsClientUtil.uploadImageAndCrtThumbImageByBase64("data:image/png;base64,"+imgBase64);

System.out.println("------------" +fileName);//fileName:上传后的文件(含路径):group1/M00/00/20/wKgoVF8hHdSAaRrkAAAlClwx2Hg883.png//访问:http://192.168.40.84:8888/group1/M00/00/20/wKgoVF8hHdSAaRrkAAAlClwx2Hg883.png

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值