teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

回答例追記

2021/08/26 08:59

投稿

nobonobo
nobonobo

スコア3367

answer CHANGED
@@ -4,7 +4,7 @@
4
4
  次にその際のファイル名を「img/」をReadDirした結果に置き換えるだけなんですが、それはshow.htmlの内容が動的に変化するということになります。
5
5
  動的なHTMLコンテンツを返すのにはどういう仕組みを使うのか考えてみてください。
6
6
 
7
- 追記
7
+ ## 追記その1
8
8
 
9
9
  そのshow.html例で表示されるようにするために、必要なハンドラが以下になります。
10
10
  参考: [https://echo.labstack.com/guide/static-files/](https://echo.labstack.com/guide/static-files/)
@@ -20,4 +20,66 @@
20
20
  <img src="/img/ファイル名">
21
21
  <img src="/img/ファイル名">
22
22
  ...
23
+ ```
24
+
25
+ ## 追記その2
26
+
27
+ できれば上記の回答の段階を踏んだ方が自己解決力が向上するのですが、
28
+ だいぶ放置されているので回答例をあげておきます。
29
+
30
+ - echoインスタンスのRendererにRendererインターフェースを満たすものをあらかじめ入れておきます。
31
+ - (echo.Context).Render(...)にてRenderer.Render(...)を呼んだ結果を受け取れます。
32
+ - Renderにはテンプレート名と任意のオブジェクトが渡せます。
33
+ - テンプレートでは「{{.}}」にて上記の任意のオブジェクトを参照することができます。
34
+ - この場合、filesを渡したのでos.FileInfoのスライスが参照できます。
35
+ - 「{{range $v := .}}」にてfilesを1要素づつ取り出して「{{end}}」までの内容を繰り返します。
36
+ - 「{{$v.Name}}」という記述は(os.FileInfo).Name()にアクセスすることになります。
37
+
38
+ ```go
39
+ import (
40
+ "github.com/labstack/echo/v4"
41
+ )
42
+
43
+ type Template struct {
44
+ templates *template.Template
45
+ }
46
+
47
+ func (t *Template) Render(w io.Writer, name string, data interface{}, c echo.Context) error {
48
+ log.Println(t.templates, name, data)
49
+ return t.templates.ExecuteTemplate(w, name, data)
50
+ }
51
+
52
+ func show(c echo.Context) error {
53
+ files, _ := ioutil.ReadDir("img")
54
+ return c.Render(http.StatusOK, "show.html", files)
55
+ }
56
+ ```
57
+
58
+ ```go
59
+ e := echo.New()
60
+ e.Renderer = &Template{
61
+ templates: template.Must(template.ParseGlob("templates/*.html")),
62
+ }
63
+ ```
64
+
65
+ show.html
66
+ ```html
67
+ <!DOCTYPE html>
68
+ <html>
69
+ <head>
70
+ <meta charset="utf-8" />
71
+ <title>画像をある分だけ表示する</title>
72
+ </head>
73
+
74
+ <body>
75
+ {{range $v := .}}
76
+ <div>
77
+ <label>{{$v.Name}}</label>
78
+ <div>
79
+ <img src="/img/{{$v.Name}}" width="20%" />
80
+ </div>
81
+ </div>
82
+ {{end}}
83
+ </body>
84
+ </html>
23
85
  ```

1

追記

2021/08/26 08:59

投稿

nobonobo
nobonobo

スコア3367

answer CHANGED
@@ -2,4 +2,22 @@
2
2
  それを表示するページを提供するときにどのようにshow.htmlがどうなっていれば表示できるか考えてみてください。まずはそれを追記してみてください。
3
3
 
4
4
  次にその際のファイル名を「img/」をReadDirした結果に置き換えるだけなんですが、それはshow.htmlの内容が動的に変化するということになります。
5
- 動的なHTMLコンテンツを返すのにはどういう仕組みを使うのか考えてみてください。
5
+ 動的なHTMLコンテンツを返すのにはどういう仕組みを使うのか考えてみてください。
6
+
7
+ 追記
8
+
9
+ そのshow.html例で表示されるようにするために、必要なハンドラが以下になります。
10
+ 参考: [https://echo.labstack.com/guide/static-files/](https://echo.labstack.com/guide/static-files/)
11
+ ```
12
+ e.Static("/img", "img")
13
+ ```
14
+
15
+ これで`/show`の表示に「/img/sample.png」の画像表示はできましたでしょうか?
16
+ その後、show.htmlをテンプレートを使って以下のようなHTMLが出力されるように書けば良いわけです。
17
+ ```html
18
+ <img src="/img/ファイル名">
19
+ <img src="/img/ファイル名">
20
+ <img src="/img/ファイル名">
21
+ <img src="/img/ファイル名">
22
+ ...
23
+ ```