码迷,mamicode.com
首页 > 编程语言 > 详细

springboot配置虚拟路径访问用户上传的附件及图片资源

时间:2019-10-17 18:01:40      阅读:261      评论:0      收藏:0      [点我收藏+]

标签:detail   load   通过   访问   tac   memory   config   csdn   %s   

在springmvc项目中,我们通常把图片及附件存放到WEB-INF/upload类似的路径。

springboot项目是通过jar包方式运行的。

笔者曾尝试以下代码,把图片转成base64格式的图片。

import lombok.extern.slf4j.Slf4j;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;


@Slf4j
public final class GraphUtil {

    /**
     * Encode Image to Base64 String
     * @param image
     * @param type
     * @return
     */
    public static String encodeToString(BufferedImage image, String type) {

        String imageString = null;
        ByteArrayOutputStream bos = new ByteArrayOutputStream();

        try {
            ImageIO.write(image, type, bos);
            byte[] imageBytes = bos.toByteArray();

            BASE64Encoder encoder = new BASE64Encoder();
            imageString = encoder.encode(imageBytes);

            bos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return imageString;
    }


    /***
     * Decode Base64 String to Image
     * @param imageString
     * @return
     */
    public static BufferedImage decodeToImage(String imageString) {

        BufferedImage image = null;
        byte[] imageByte;
        try {
            BASE64Decoder decoder = new BASE64Decoder();
            imageByte = decoder.decodeBuffer(imageString);
            ByteArrayInputStream bis = new ByteArrayInputStream(imageByte);
            image = ImageIO.read(bis);
            bis.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return image;
    }

    public static BufferedImage getBufferedImage(String basePath, String imageSource){

        try {
            return ImageIO.read(new BufferedInputStream(Files.newInputStream(Paths.get(basePath, imageSource))));
        } catch (IOException e) {
            log.error("读取图片出错:{}",e);
            return null;
        }
    }
}
 String url2Base64EncodedImg(String url)
    {
        //根据图片url转成base64格式
        //src="data:image/xxx;base64 xxxxx
        BufferedImage bufferedImage = GraphUtil.getBufferedImage(storageRootFolder, url);
        if(Objects.isNull(bufferedImage)) {
            return ""; //TODO:默认破图base64?
        }
        String type = FilenameUtils.getExtension(url);
        return String.format("data:image/%s;base64,%s",type,GraphUtil.encodeToString(bufferedImage, type));
    }

得到前端图片如下:

技术图片

 

 

不失为一种解决方法,当时当图片大的时候查看源代码,图片经过编码占用大量屏幕,比较麻烦。

于是寻找另外一种办法,使用虚拟路径,映射到文件系统上的目录。

配置方法如下:

@Configuration
public class WebAppConfig extends WebMvcConfigurerAdapter {

    @Value("${spring.servlet.multipart.location}")
    private String storageRootFolder;

    @Value("${spring.servlet.asset.virtual.path}")
    String virtualPath;

/***
     * 配置图片等资源虚拟路径
     * @param registry
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler(virtualPath).addResourceLocations("file:" + storageRootFolder+"/");
    }

}

application.yml配置文件如下:

spring:
  servlet:
    multipart:
      max-file-size: 100MB
      max-request-size: 100MB
      file-size-threshold: 10MB #maxInMemorySize
      location: ${TEMP}  #使用${}取系统环境变量值
    asset.virtual.path: /asset/**

配置好以后效果如下:

技术图片

 

 

参考来源:

https://blog.csdn.net/superlover_/article/details/80893007

springboot配置虚拟路径访问用户上传的附件及图片资源

标签:detail   load   通过   访问   tac   memory   config   csdn   %s   

原文地址:https://www.cnblogs.com/passedbylove/p/11693179.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!