Skip to content

将磁盘文件(夹)映射为网络路径

如何将项目外的某些文件(夹)映射为网络路径?

  • 例如:访问 /download/** 时,响应 /file/ 文件夹下的文件

解决方案

java
package cloud.xuxiaowei.file.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.lang.NonNull;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * {@link WebMvcConfigurationSupport} 优先级比 {@link WebMvcConfigurer} 高
 * <p>
 * 使用了 {@link WebMvcConfigurationSupport} 之后,{@link WebMvcConfigurer} 会失效
 * <p>
 * 一旦自定义了配置,默认配置将会被覆盖
 *
 * @author xuxiaowei
 * @since 0.0.1
 */
@Configuration
public class WebMvcConfigurationSupportConfig extends WebMvcConfigurationSupport {

    @Override
    protected void addResourceHandlers(@NonNull ResourceHandlerRegistry registry) {

        // 此行配置用于确保 src/main/resources/static 静态文件夹可以正常访问
        registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");

        // 将网络路径 /download/** 映射到 /file/ 文件夹(在 Windows 系统中,/file/ 代表 当前软件运行的盘符的根目录)
        // 示例:访问 /download/test.png 时,Spring MVC 会尝试查看 /file/test.png 是否存在,如果存在,将返回此图片
        registry.addResourceHandler("/download/**").addResourceLocations("file:/file/");
    }

}
java
package cloud.xuxiaowei.file.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.lang.NonNull;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * {@link WebMvcConfigurationSupport} 优先级比 {@link WebMvcConfigurer} 高
 * <p>
 * 使用了 {@link WebMvcConfigurationSupport} 之后,{@link WebMvcConfigurer} 会失效
 * <p>
 * 不会进行覆盖默认配置
 *
 * @author xuxiaowei
 * @since 0.0.1
 */
@Configuration
public class WebMvcConfigurerConfig implements WebMvcConfigurer {

    @Override
    public void addResourceHandlers(@NonNull ResourceHandlerRegistry registry) {

        // 无需处理 src/main/resources/static 静态文件夹内的文件,不会进行覆盖默认配置

        // 将网络路径 /download/** 映射到 /file/ 文件夹(在 Windows 系统中,/file/ 代表 当前软件运行的盘符的根目录)
        // 示例:访问 /download/test.png 时,Spring MVC 会尝试查看 /file/test.png 是否存在,如果存在,将返回此图片
        registry.addResourceHandler("/download/**").addResourceLocations("file:/file/");
    }

}