赞
踩
技术概述
在编写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 的基础认知还是不够全面,需要多多学习。
最后本人是个小萌新,请大佬们多多指教!!!!!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。