Resuelva el problema de Spring Boot accediendo a recursos estáticos en el directorio de recursos (versión detallada)

1. Resuelva el problema de Spring Boot accediendo a recursos estáticos en el directorio de recursos

A continuación se analiza el acceso y se carga el contenido del directorio estático desde los dos aspectos de lectura y escritura.

1.2 Leer

Leer recursos (es decir, acceder a recursos estáticos en la web) es realmente muy simple. Spring Boot está configurado con el mapeo /static/** de forma predeterminada, por lo que se puede acceder sin ninguna configuración. Sin embargo, debe tenerse en cuenta que si se utiliza un motor de plantillas (como thymeleaf), se requiere una configuración manual. A continuación, se muestran dos formas de acceder a los recursos estáticos a través del motor de plantillas:

  • Coloque los recursos directamente en el directorio de plantillas, y luego puede acceder a ellos por ruta, porque de forma predeterminada, encontrará recursos estáticos en el directorio de plantillas.
    inserte la descripción de la imagen aquí

    Visite hello.html directamente: localhost:8080/hello.html
  • Si desea acceder directamente a recurso/estático, debe agregar la siguiente configuración en application.yml; de lo contrario, aparecerá 404

    spring:
      mvc:
        static-path-pattern: /static/**
    

2. Escribe

También se denomina carga de recursos. De hecho, no se recomienda escribir directamente archivos relacionados con la empresa (especialmente imágenes almacenadas) en el directorio de recursos, ya que puede encontrar

  • Los problemas de acceso a recursos en tiempo real, como cargar imágenes y luego acceder a ellas, pueden requerir reiniciar para continuar accediendo
  • jar protege el directorio de recursos y es posible que los recursos cargados no se lean

Sin embargo, hay muy pocos archivos que deben almacenarse en el directorio de recursos, por lo que primero debe obtener el directorio correspondiente en recursos. En este momento, debe considerar que no habrá errores al ejecutar el paquete jar en el futuro. , por lo que recomiendo dos formas de obtener el directorio estático:

  • Obtenga el directorio estático a través de la herramienta ResourceUtils

    try {
          
          
    File staticDir = new File (ResourceUtils.getURL("classpath:static").getPath());
    } catch (FileNotFoundException e) {
          
          
        // static 目录不存在!
        e.printStackTrace();
    }
    
  • Consíguelo a través de ClassPathResource

    // 这里要具体到你要访问的文件,然后拿到文件流对象,你就可以放肆操作了!
    ClassPathResource classPathResource = new ClassPathResource("/static/xxx/xxx.png");
    InputStream inputStream = classPathResource.getInputStream();
    // 转成字节数组
    final byte[] bytes = IOUtil.toByteArray(inputStream);
    // 比如把图片装成 base64 编码的字符串
    String imgStr = "data:image/png;base64, " + Base64.getEncoder().encodeToString(bytes);
    

1.3 Resumen

Finalmente, me gustaría decir que si desea cargar imágenes, es mejor no cargar imágenes directamente en el paquete jar, debe considerar:

  • Para crear un servidor de recursos estáticos dedicado (servidor de imágenes), puede usar nginx

  • En segundo lugar, puede considerar crear un directorio de mapeo en el disco duro local:

    Agregue el archivo de configuración WebMVCConfig y luego agregue la asignación de recursos:

    @Slf4j
    @Configuration
    public class WebMVCConfig implements WebMvcConfigurer {
          
          
        
        @Value("${logo-img.request-path}")
        private String logoReqPath; // 请求地址
        @Value("${logo-img.local-path}")
        private String logoLocPath; // 本地存放资源目录的绝对路径
    	
        @Override
        public void addResourceHandlers(ResourceHandlerRegistry registry) {
          
          
            File logoDir = new File(logoLocPath);
            boolean flag = false;
            if (!logoDir.exists())
                flag = logoDir.mkdirs();
            if (flag)
                log.info("已成功创建资源 logo 目录:{}", logoLocPath);
    
            log.info("getAbsolutePath = {}", logoDir.getAbsolutePath());
            log.info("getPath = {}", logoDir.getPath());
            
            registry.addResourceHandler(logoReqPath)
                    .addResourceLocations("file:" + logoDir.getAbsolutePath() + File.separator);
        }
    }
    

    Los parámetros anteriores se configuran en application.yml de la siguiente manera:
    inserte la descripción de la imagen aquí

    El último acceso /logo-view-s/xxx.pnga se asignará aD:/test/logos/xxx.png

Supongo que te gusta

Origin blog.csdn.net/dubulingbo/article/details/122105876
Recomendado
Clasificación