私は新しい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
それを機能させるにはどうすればよいですか?
デフォルトでは、Spring Bootアプリケーションは staticcontent を提供します-あなたの場合は画像-次の場所にあります:
したがって、通常、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/");
}
}
images folder
から画像にアクセスするには、
次のように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}}"/>
外部ファイルは、jarと同じディレクトリ内の_/static
_という名前のフォルダーに保存でき、Springはデフォルトでそれらをスキャンします。したがって、_static/images/
_がある場合は、次を使用して画像を参照できます。
_<img th:src="@{/images/img.ext}"/>
_
したがって、new File("/static/images/" + imgName);
を使用したいでしょう。