技术概述
在编写spring boot后端项目时,后端需要接收前端转换完毕的base64图片,并且将图片存入到指定目录上。这一技术难点就在于在如何将base64转换成图片并存入指定目录路径。
代码内容
1、controller文件内容 接收传入的base64
@PostMapping("/base64Imager")
@ApiOperation(notes = "base64Imager",value = "base64上传图片")
public RestResponse<String> base64Imager(String base64Imager){
String fileImager = toolService.base64ToImage(base64Imager);
return RestResponse.ok(fileImager);
}
2、service文件内容 将base64转换为 MultipartFile类型并上传至目录
/**
* 将base64图片转换成图片并存入指定目录中
* @param base64Imager
* @return
*/
public String base64ToImage(String base64Imager){
//定义上传图片保存路径
String path = "图片想要保存的路径";
//将base64 转换成 MultipartFile
MultipartFile file =
BASE64DecodedMultipartFileUtil.base64ToMultipart(base64Imager);
//图片名称
String fileName = file.getOriginalFilename();
//获取图片的后缀名
String suffixName = fileName.substring(fileName.lastIndexOf("."));
//生成新的图片名称
String newImgName = UUID.randomUUID().toString()+suffixName;
File filepath = new File(path,newImgName);
// 判断路径是否存在,如果不存在就创建一个
if (!filepath.getParentFile().exists()) {
filepath.getParentFile().mkdirs();
}
try {
// 写入文件
file.transferTo(new File(path + File.separator + newImgName));
log.info("文件上传成功,上传路径为: "+path+newImgName);
return path+newImgName;
} catch (IOException e) {
e.printStackTrace();
log.info("文件上传失败");
return null;
}
}
3、BASE64DecodedMultipartFileUtil 工具内容 用于转换 base64
import org.springframework.web.multipart.MultipartFile;
import java.io.*;
import java.util.Base64;
import java.util.Base64.Decoder;
public class BASE64DecodedMultipartFileUtil implements MultipartFile {
private final byte[] imgContent;
private final String header;
public BASE64DecodedMultipartFileUtil(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 byte[] getBytes() 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(",");
// /lib/tool.jar和/lib/rt.jar已经从JDK9中删除
// 如果你不是JDK 9及以上的版本 可以使用
// BASE64Decoder decoder = new BASE64Decoder();
Decoder decoder = Base64.getDecoder();
byte[] b = decoder.decode(baseStrs[1]);
for(int i = 0; i < b.length; ++i) {
if (b[i] < 0) {
b[i] += 256;
}
}
return new BASE64DecodedMultipartFileUtil(b, baseStrs[0]);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
经过以上步骤,我们就可以向指定目录中上传一张图片了。
技术使用过程中遇到的问题以及解决过程
上传图片到服务器过程中,由于服务器是Linux系统,与我们平时使用的Windows系统不同,Linux文件路径与Windows有较大的差异,文件名与文件路径之间要用"/"来隔开,而不是Windows中的"\"。这一点要注意,否则服务器上的文件就无法索引到。
技术总结
上传图片虽然步骤没有多么复杂,但是还是要注意一些小细节,以免在出现错误的时候,不好查找,最近一直在整理开发中会遇到使用的工具类,发现对于java 的基础认知还是不够全面,需要多多学习。
最后本人是个小萌新,请大佬们多多指教!!!!!