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