Spring Bootがリソースディレクトリ内の静的リソースにアクセスする問題を解決する(詳細版)

1. Spring Boot がリソース ディレクトリ内の静的リソースにアクセスする問題を解決する

以下は、読み取りと書き込みの 2 つの側面から静的ディレクトリの内容にアクセスしてアップロードする分析です。

1.2 読む

リソースの読み取り (つまり、Web 上の静的リソースへのアクセス) は実際には非常に簡単で、Spring Boot はデフォルトで /static/** マッピングを使用して構成されているため、構成なしでアクセスできます。ただし、テンプレート エンジン (thymeleaf など) を使用する場合は、手動構成が必要であることに注意してください。次に、テンプレート エンジンを通じて静的リソースにアクセスする 2 つの方法を示します。

  • リソースをテンプレート ディレクトリに直接配置すると、パスによってリソースにアクセスできます。デフォルトでは静的リソースがテンプレート ディレクトリにあるためです。
    ここに画像の説明を挿入

    hello.html に直接アクセスします: localhost:8080/hello.html
  • resource/static に直接アクセスしたい場合は、application.yml に次の設定を追加する必要があります。追加しないと 404 が表示されます。

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

2. 書く

リソースのアップロードとも呼ばれますが、実際には、ビジネス関連のファイル (特に保存されている画像) をリソース ディレクトリに直接書き込むことはお勧めできません。

  • 写真をアップロードしてからアクセスするなど、リアルタイムのリソース アクセスの問題が発生すると、アクセスを続けるために再起動が必要になる場合があります。
  • jar はリソース ディレクトリを保護しており、アップロードされたリソースは読み取られない可能性があります

ただし、resources ディレクトリに保存する必要があるファイルは非常に少ないため、最初に resource 配下の対応するディレクトリを取得する必要があります。この時点では、将来 jar パッケージを実行するときにエラーが発生しないことを考慮する必要があります。そのため、静的ディレクトリを取得するには 2 つの方法をお勧めします。

  • ResourceUtils ツールを使用して静的ディレクトリを取得します。

    try {
          
          
    File staticDir = new File (ResourceUtils.getURL("classpath:static").getPath());
    } catch (FileNotFoundException e) {
          
          
        // static 目录不存在!
        e.printStackTrace();
    }
    
  • 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 概要

最後に、画像をアップロードする場合は、jar パッケージに画像を直接アップロードしないことをお勧めします。

  • 専用の静的リソース サーバー (イメージ サーバー) を構築するには、nginxを使用できます。

  • 次に、ローカル ハードディスク上にマッピング ディレクトリを作成することを検討できます。

    構成ファイル WebMVCConfig を追加し、リソース マッピングを追加します。

    @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);
        }
    }
    

    上記のパラメータは、application.yml で次のように構成されます。
    ここに画像の説明を挿入

    への最後のアクセスは/logo-view-s/xxx.pngマップされますD:/test/logos/xxx.png

おすすめ

転載: blog.csdn.net/dubulingbo/article/details/122105876