web-dev-qa-db-ja.com

Spring Bootイメージのアップロードと提供

私は新しいSpring Bootアプリを作成していますが、画像を保存して提供できるようにしたい、画像をアプリケーションディレクトリに保存したい here

現時点では、これがアップロードの様子です。

@PostMapping("/")
@ResponseBody
public String upload(@RequestPart String title, @RequestPart MultipartFile img) throws IOException{
    String imgName = img.getOriginalFilename();
    Post p = new Post();
    p.setTitle(title);
    p.setImageName(imgName);
    postService.add(p);
    File upl = new File("images/" + imgName);
    upl.createNewFile();
    FileOutputStream fout = new FileOutputStream(upl);
    fout.write(img.getBytes());
    fout.close();
    return "ok";
}

これは私が画像を取得したい方法です

<img th:src="@{'images/' + ${post.imageName}}"/>

今のところ私は404を取得し、ディレクトリ内のいくつかの画像を表示したいときに取得します

Fatal error reading PNG image file: Not a PNG file

それを機能させるにはどうすればよいですか?

7
Weras Adve

デフォルトでは、Spring Bootアプリケーションは staticcontent を提供します-あなたの場合は画像-次の場所にあります:

  • /静的
  • /公衆
  • / resources
  • / META-INF/resources

したがって、通常、static/images/は、おそらく、Thymeleafがレンダリングのために配信する必要があるstaticイメージを予期する場所です。しかし、この場所はstaticコンテンツに関するものであり、一般的にアプリケーション内にアップロードされた(動的な)コンテンツを保存するのは悪い考えなので、お勧めしますそれをしないでください。アプリケーションを別のマシンに再デプロイまたは移動するとどうなるか考えましたか?面倒な方法で画像をバックアップ/移動する必要があります。アップロードコンテンツをアプリの外部の別の場所に格納する(たとえば、構成可能で、複数のインスタンスで再利用できる)か、データベースを使用して画像データを格納することもできます。また、トランザクションコンテキストでイメージを処理できるようになります(例:分離とロールバック)。

ただし、今でもアプリ内に保存する場合は、検索する場所を追加することで場所を拡張できます(実際にはstaticコンテンツ)。 Ajitの答えとドキュメントでさえ、あなた自身のWebMvcConfigurerAdapterを拡張するためのアドバイスを提供していますが、私は個人的に WebMvcConfigurer を実装する傾向があります。

この場合、次のようになります。

@Configuration
public class AdditionalResourceWebConfiguration implements WebMvcConfigurer {
    @Override
    public void addResourceHandlers(final ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/images/**").addResourceLocations("file:images/");
    }
}
16
Kevin Peters

images folderから画像にアクセスするには、

enter image description here

次のようにaddResourceHandlersクラスのWebMvcConfigurerAdapterメソッドをオーバーライドする必要があります。

@Configuration
public class ResourceConfig extends WebMvcConfigurerAdapter {
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/images/**").addResourceLocations("file:images/");
    }
}

その後、次のようにURLの画像の前に/を追加する必要があります。

<img th:src="@{'/images/' + ${post.imageName}}"/>
4
Ajit Soman

外部ファイルは、jarと同じディレクトリ内の_/static_という名前のフォルダーに保存でき、Springはデフォルトでそれらをスキャンします。したがって、_static/images/_がある場合は、次を使用して画像を参照できます。

_<img th:src="@{/images/img.ext}"/>_

したがって、new File("/static/images/" + imgName);を使用したいでしょう。

1
Scott