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

在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

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

时间: 2024-11-09 06:32:44

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

Tomcat配置虚拟路径,使上传文件与服务器及工程文件分离开

   使用Tomcat虚拟路径可以达到一个怎样的效果呢?简单说你可以把上传的文件放在你想发的任何一个地方,同时可以自己区分 下文件的类型,图片文件专门放一个地方,压缩包文件放另一个地方. 其实如何配置非常简单,这里以window环境来说明! 首先找到tomcat目录下conf目录下的server.xml文件 在server.xml文件中找到<Host></Host> 然后在其中加上这两句              <Context path="/demo/file&

Tomcat配置虚拟路径,使上传文件与服务器分离

遇到问题介绍:项目中头像上传,上传图片到服务器.如果使用tomcat下的目录作为上传图片的路径,则每次重启服务器图片将消失 遇到问题:使用服务器物理磁盘的D:\upload路径存储文件,访问请求路径的不会映射到希望到的请求. 解决:可以使用tomcat的配置文件将某个请求 映射到 物理路径下 ,完成图片的回显. 具体操作:使用Tomcat虚拟路径 1.修改tomcat的配置文件 window环境   首先找到tomcat目录下conf目录下的server.xml文件   在server.xml文

linux服务器创建虚拟路径解决文件上传路径隔离问题

需求环境 图片上传最简单的就是上传web项目下,这样图片与项目不可分离会产生很多不必要的影响.例如:重新部署项目需要把所有上传的图片再copy一份等. 图片与项目分离有好几种方式: 方式一.在linux服务器下创建一个文件夹路径,映射到tomcat服务器相对路径[本节介绍]. 方式二.如果有条件的话,自己搭建图片服务器. 第一步:在linux下创建上传图片的文件夹(自定义) makdir -p /usr/java/uploadFiles 第二步:修改tomcat中conf下的server.xml

springboot上传文件 &amp; 不配置虚拟路径访问服务器图片 &amp; springboot配置日期的格式化方式

1.    Springboot上传文件 springboot的文件上传不用配置拦截器,其上传方法与SpringMVC一样 @RequestMapping("/uploadPicture") @ResponseBody public JSONResultUtil uploadPicture(MultipartFile file, Integer viewId) { if (file == null) { return JSONResultUtil.error("文件没接到&q

tomcat配置虚拟路径,可以解决实际开发中测试时前端访问后台电脑上的图片的问题

首先电脑上要已经安装好tomcat,安装tomcat的教程可以从网上找到很多.这里就不赘述了. 一般开始做一个web项目后,会涉及到用户头像,商品图片等信息,这些图片保存在项目中不方便,于是我将选择保存在某个磁盘的一个文件夹中,例如 D:/img 这样的话,使用全路径会相应的有些不方便,于是我就选择在tomcat中配置虚拟路径,打开tomcat目录 找到他的配置文件夹conf,然后打开,看见如下所示 然后用某个文本编辑器(记事本格式乱,不建议使用)打开 server.xml 文件,在最后找到 <

django 用户上传文件media的存储访问配置1

1. 首先新建文件夹media  后 在项目setting中具体配置: 1 MEDIA_URL = '/media/' 2 MEDIA_ROOT = os.path.join(BASE_DIR, 'media') 在 setting 中的 TEMPLATES 下的 OPTIONS 中的 context_processors 中追加: TEMPLATES = [ { 'DIRS': [os.path.join(BASE_DIR, 'templates')], ...... 'OPTIONS': {

tomcat配置虚拟路径,供用户访问静态资源

tomcat配置虚拟路径,供用户访问静态资源 在实际开发中,后台需要提供给用户访问静态资源,而且该静态资源不是在tomcat中,即不是在web目录下,那么用户是不能访问的,这时,需要配置tomcat服务器的虚拟路径.可以这样理解这个虚拟路径,就是相当于把该路径映射成一个web工程,这样这些静态资源就相当于在web路径下了,用户也就可以访问了. 简单的配置如下:tomcat安装目录/conf/server.xml      在最后面可以看到Host标签,在该标签中增加一个Context标签如下即可

Django配置用户上传文件夹和暴露后端文件夹资源

网站所用的静态文件我们都默认存放到static文件夹下,而用户上传的文件也是静态资源,我们需要找一个公共的地方专门存储用户上传的静态文件. 针对用户上传的不同文件,保存到指定的文件夹下. media配置专门用来指定用户上传的静态文件存放路径 1.配置文件中书写以下代码 # settings.py MEDIA_ROOT = os.path.join(BASE_DIR, 'media') # 用户上传的文件就会保存到该文件夹下 # media是文件夹的名字,可以自定义,一般使用media作为名字 当

Servlet配置虚拟路径(访问路径)的三种方法以及web开发中的路径问题

一.虚拟路径 配置虚拟路径 web.xml配置文件的虚拟路径 <servlet-mapping> <url-pattern>/demo5</url-pattern> </servlet-mapping> 三种配置方法 * 完全路径匹配 * 以/开头的                 /demo5         /servlet/demo5 * 目录匹配   * 以/开头的                    /*   * 通过:http://localh