当前位置:   article > 正文

Java Base64上传图片并存入指定目录_java 上传base64图片

java 上传base64图片

技术概述

在编写spring boot后端项目时,后端需要接收前端转换完毕的base64图片,并且将图片存入到指定目录上。这一技术难点就在于在如何将base64转换成图片并存入指定目录路径。

代码内容

1、controller文件内容  接收传入的base64

  1. @PostMapping("/base64Imager")
  2. @ApiOperation(notes = "base64Imager",value = "base64上传图片")
  3. public RestResponse<String> base64Imager(String base64Imager){
  4. String fileImager = toolService.base64ToImage(base64Imager);
  5. return RestResponse.ok(fileImager);
  6. }

2、service文件内容 将base64转换为 MultipartFile类型并上传至目录

  1. /**
  2. * 将base64图片转换成图片并存入指定目录中
  3. * @param base64Imager
  4. * @return
  5. */
  6. public String base64ToImage(String base64Imager){
  7. //定义上传图片保存路径
  8. String path = "图片想要保存的路径";
  9. //将base64 转换成 MultipartFile
  10. MultipartFile file =
  11. BASE64DecodedMultipartFileUtil.base64ToMultipart(base64Imager);
  12. //图片名称
  13. String fileName = file.getOriginalFilename();
  14. //获取图片的后缀名
  15. String suffixName = fileName.substring(fileName.lastIndexOf("."));
  16. //生成新的图片名称
  17. String newImgName = UUID.randomUUID().toString()+suffixName;
  18. File filepath = new File(path,newImgName);
  19. // 判断路径是否存在,如果不存在就创建一个
  20. if (!filepath.getParentFile().exists()) {
  21. filepath.getParentFile().mkdirs();
  22. }
  23. try {
  24. // 写入文件
  25. file.transferTo(new File(path + File.separator + newImgName));
  26. log.info("文件上传成功,上传路径为: "+path+newImgName);
  27. return path+newImgName;
  28. } catch (IOException e) {
  29. e.printStackTrace();
  30. log.info("文件上传失败");
  31. return null;
  32. }
  33. }

3、BASE64DecodedMultipartFileUtil 工具内容 用于转换 base64

  1. import org.springframework.web.multipart.MultipartFile;
  2. import java.io.*;
  3. import java.util.Base64;
  4. import java.util.Base64.Decoder;
  5. public class BASE64DecodedMultipartFileUtil implements MultipartFile {
  6. private final byte[] imgContent;
  7. private final String header;
  8. public BASE64DecodedMultipartFileUtil(byte[] imgContent, String header) {
  9. this.imgContent = imgContent;
  10. this.header = header.split(";")[0];
  11. }
  12. @Override
  13. public String getName() {
  14. // TODO - implementation depends on your requirements
  15. return System.currentTimeMillis() + Math.random() + "." + header.split("/")[1];
  16. }
  17. @Override
  18. public String getOriginalFilename() {
  19. // TODO - implementation depends on your requirements
  20. return System.currentTimeMillis() + (int)Math.random() * 10000 + "." + header.split("/")[1];
  21. }
  22. @Override
  23. public String getContentType() {
  24. // TODO - implementation depends on your requirements
  25. return header.split(":")[1];
  26. }
  27. @Override
  28. public boolean isEmpty() {
  29. return imgContent == null || imgContent.length == 0;
  30. }
  31. @Override
  32. public long getSize() {
  33. return imgContent.length;
  34. }
  35. @Override
  36. public byte[] getBytes() throws IOException {
  37. return imgContent;
  38. }
  39. @Override
  40. public InputStream getInputStream() throws IOException {
  41. return new ByteArrayInputStream(imgContent);
  42. }
  43. @Override
  44. public void transferTo(File dest) throws IOException, IllegalStateException {
  45. new FileOutputStream(dest).write(imgContent);
  46. }
  47. public static MultipartFile base64ToMultipart(String base64) {
  48. try {
  49. String[] baseStrs = base64.split(",");
  50. // /lib/tool.jar和/lib/rt.jar已经从JDK9中删除
  51. // 如果你不是JDK 9及以上的版本 可以使用
  52. // BASE64Decoder decoder = new BASE64Decoder();
  53. Decoder decoder = Base64.getDecoder();
  54. byte[] b = decoder.decode(baseStrs[1]);
  55. for(int i = 0; i < b.length; ++i) {
  56. if (b[i] < 0) {
  57. b[i] += 256;
  58. }
  59. }
  60. return new BASE64DecodedMultipartFileUtil(b, baseStrs[0]);
  61. } catch (Exception e) {
  62. e.printStackTrace();
  63. return null;
  64. }
  65. }
  66. }

经过以上步骤,我们就可以向指定目录中上传一张图片了。

技术使用过程中遇到的问题以及解决过程

上传图片到服务器过程中,由于服务器是Linux系统,与我们平时使用的Windows系统不同,Linux文件路径与Windows有较大的差异,文件名与文件路径之间要用"/"来隔开,而不是Windows中的"\"。这一点要注意,否则服务器上的文件就无法索引到。

技术总结

上传图片虽然步骤没有多么复杂,但是还是要注意一些小细节,以免在出现错误的时候,不好查找,最近一直在整理开发中会遇到使用的工具类,发现对于java 的基础认知还是不够全面,需要多多学习。

最后本人是个小萌新,请大佬们多多指教!!!!!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/715571
推荐阅读
相关标签
  

闽ICP备14008679号