コンテンツにスキップ

ファイルからのデータ配信

Ginはクライアントにファイルを配信するためのいくつかのメソッドを提供しています。各メソッドは異なるユースケースに適しています:

  • c.File(path) — ローカルファイルシステムからファイルを配信します。コンテンツタイプは自動検出されます。コンパイル時にファイルパスが分かっている場合や、すでにバリデーション済みの場合に使用します。
  • c.FileFromFS(path, fs)http.FileSystemインターフェースからファイルを配信します。埋め込みファイルシステム(embed.FS)、カスタムストレージバックエンド、または特定のディレクトリツリーへのアクセスを制限したい場合に便利です。
  • c.FileAttachment(path, filename)Content-Disposition: attachmentヘッダーを設定してダウンロードとしてファイルを配信します。ブラウザはディスク上の元のファイル名に関係なく、指定したファイル名でファイルの保存を促します。
package main
import (
"net/http"
"github.com/gin-gonic/gin"
)
func main() {
router := gin.Default()
// ファイルをインラインで配信(ブラウザに表示)
router.GET("/local/file", func(c *gin.Context) {
c.File("local/file.go")
})
// http.FileSystemからファイルを配信
var fs http.FileSystem = http.Dir("/var/www/assets")
router.GET("/fs/file", func(c *gin.Context) {
c.FileFromFS("fs/file.go", fs)
})
// カスタムファイル名でダウンロード可能な添付ファイルとして配信
router.GET("/download", func(c *gin.Context) {
c.FileAttachment("local/report-2024-q1.xlsx", "quarterly-report.xlsx")
})
router.Run(":8080")
}

curlでダウンロードエンドポイントをテストできます:

Terminal window
# -vフラグでContent-Dispositionヘッダーを表示
curl -v http://localhost:8080/download --output report.xlsx
# ファイルをインラインで配信
curl http://localhost:8080/local/file

io.Readerからのデータストリーミング(リモートURLや動的に生成されるコンテンツなど)については、代わりにc.DataFromReader()を使用してください。詳細はリーダーからのデータ配信をご覧ください。