SpringBoot 不能显示 jpeg 的图片

web:
   resources:
     static-locations: file:${vipsoft.item-images-path}

vipsoft:
  item-images-path: ./images

通过浏览器 http://localhost:8181/abc.jpeg 打不开。png、jpg的图片可以打开
但直接在浏览器中输入 D:\Project\Images\abc.jpeg 是可以打开的。

需要添加一下 MIME的配置

在 Spring Boot 中,MIME 类型(即 Content-Type)的配置可以通过以下几种方式管理:


1. 通过 WebMvcConfigurer 自定义 MIME 映射

如果 .jpeg 文件没有被正确识别,可以在 Spring Boot 配置类中手动添加 MIME 类型映射:

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class MimeConfig implements WebMvcConfigurer {

    @Override
    public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
        // 确保 .jpeg 扩展名映射到 image/jpeg
        configurer.mediaType("jpeg", MediaType.IMAGE_JPEG);
    }
}

或者,更直接的方式是修改 application.yml/application.properties

spring:
  mvc:
    contentnegotiation:
      media-types:
        jpeg: image/jpeg

2. 检查 application.yml 静态资源配置

确保你的静态资源路径配置正确:

spring:
  web:
    resources:
      static-locations: file:///D:/Project/Images/
      # 或者直接使用 classpath: 或 file: 前缀

3. 检查 ResourceHttpRequestHandler 默认行为

Spring Boot 默认使用 ResourceHttpRequestHandler 处理静态资源,它会自动检测文件扩展名并设置 Content-Type。如果 .jpeg 没有被正确处理,可能是:

  • 文件扩展名不匹配(如 .JPEG vs .jpeg
  • 文件系统权限问题
  • Spring Boot 版本问题(某些旧版本可能支持不全)

4. 手动添加 MIME 类型(适用于嵌入式 Tomcat/Jetty)

如果是嵌入式 Tomcat,可以在 application.yml 中配置:

server:
  tomcat:
    mime-mappings:
      .jpeg: image/jpeg

如果是 Jetty:

server:
  jetty:
    mime-mappings:
      .jpeg: image/jpeg

5. 检查文件是否存在(调试方法)

在 Controller 中添加调试端点,检查资源是否被正确映射:

import org.springframework.core.io.Resource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.resource.ResourceResolver;

@RestController
public class DebugController {

    private final ResourceResolver resourceResolver;

    public DebugController(ResourceResolver resourceResolver) {
        this.resourceResolver = resourceResolver;
    }

    @GetMapping("/debug-check-jpeg")
    public String checkJpeg() {
        Resource resource = resourceResolver.resolveResource(
            null,
            "abc.jpeg",
            Collections.emptyList()
        );
        return "Exists: " + resource.exists();
    }
}

访问 http://localhost:8080/debug-check-jpeg,如果返回 false,说明路径配置有问题。


6. 强制设置 Content-Type(临时解决方案)

如果以上方法无效,可以手动拦截请求并设置 Content-Type

import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.HandlerInterceptor;

@Configuration
public class MimeFixConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new HandlerInterceptor() {
            @Override
            public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
                if (request.getRequestURI().endsWith(".jpeg")) {
                    response.setContentType("image/jpeg");
                }
            }
        });
    }
}

可能的原因总结

  1. .jpeg 扩展名未注册(Spring Boot 默认可能只认 .jpg)。
  2. 路径大小写敏感(Linux/Mac 环境下需注意)。
  3. 文件权限问题(确保应用有权限访问 D:\Project\Images\)。
  4. 浏览器缓存(尝试强制刷新或隐身模式访问)。

建议先尝试 方法1方法4,通常能解决问题。如果仍然无效,请检查文件路径和权限。

image

posted @ 2025-04-02 17:55  VipSoft  阅读(76)  评论(0)    收藏  举报