web伺服器靜態資源下載

chester·chen發表於2024-10-17

1. 使用 Beego 實現靜態檔案下載

Beego 是一個強大的 Go Web 框架,提供了處理靜態檔案的功能。透過簡單的配置,我們可以將本地資料夾作為靜態資源目錄,併為使用者提供下載連結。

1.1 配置靜態檔案路徑

首先,在 main.go 中,我們使用 SetStaticPath 將本地的 staticfiles 目錄對映為可以透過 URL 訪問的靜態資源路徑。

package main

import (
    "github.com/beego/beego/v2/server/web"
)

func main() {
    // 設定靜態資源路徑,對映 /staticfiles 到本地 ./staticfiles 資料夾
    web.SetStaticPath("/staticfiles", "./staticfiles")
    web.Run()
}

透過這段程式碼,我們將本地的 ./staticfiles 目錄對映到 http://localhost:8080/staticfiles,使用者可以透過該 URL 直接訪問檔案。

2. 檔案目錄展示與下載功能

接下來,為了讓使用者能夠方便地瀏覽檔案目錄並下載檔案,我們需要實現一個控制器來展示指定目錄下的檔案列表,並生成對應的下載連結。

2.1 實現控制器

在 Beego 中,控制器負責處理路由請求。我們建立一個 FileController,其中定義了 Get 方法來讀取指定目錄,並將檔案列表傳遞給模板。

package controllers

import (
    "os"
    "github.com/beego/beego/v2/server/web"
)

type FileController struct {
    web.Controller
}

// @router /getfiles [get]
func (c *FileController) Get() {
    // 要展示的目錄路徑
    dirPath := "./staticfiles"

    // 讀取目錄內容
    files, err := os.ReadDir(dirPath)
    if err != nil {
        c.Data["error"] = "無法讀取目錄: " + err.Error()
        c.TplName = "error.tpl"
        return
    }

    // 將檔案列表傳遞給模板
    c.Data["files"] = files
    c.Data["directory"] = dirPath
    c.TplName = "directory.tpl"
}

在上面的程式碼中,os.ReadDir 函式用於讀取 staticfiles 目錄下的所有檔案和資料夾。若發生錯誤,則渲染 error.tpl 模板並顯示錯誤資訊。否則,將檔案列表傳遞給 directory.tpl 模板進行展示。

ns := beego.NewNamespace("/v1",
    beego.NSNamespace("/file",
        beego.NSInclude(&controllers.FileController{})),
)
beego.AddNamespace(ns)

將這個Contorller註冊到router中

2.2 模板檔案展示目錄

為了展示檔案列表並提供下載功能,我們建立一個簡單的 HTML 模板 views/directory.tpl,將檔名展示給使用者,併為每個檔案生成對應的下載連結。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>檔案目錄</title>
</head>
<body>
    <h1>下載檔案</h1>
    <ul>
        {{range .files}}
        {{if not .IsDir}}
        <li>
            <a href="/staticfiles/{{.Name}}" download="{{.Name}}">
                {{.Name}}
            </a>
        </li>
        {{end}}
        {{end}}
    </ul>
</body>
</html>

在這個模板中,使用 Go 模板語法遍歷從控制器傳遞來的 files 列表。對於每個檔案,生成一個 <a> 標籤,並使用 download 屬性提供檔案下載。

3. 錯誤處理頁面

如果在讀取目錄時發生錯誤,我們會渲染一個錯誤頁面 views/error.tpl。該頁面展示錯誤資訊,並提示使用者返回或重試。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>錯誤頁面</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            margin: 50px;
        }
        .error-container {
            max-width: 600px;
            margin: auto;
            padding: 20px;
            border: 1px solid #f5c6cb;
            background-color: #f8d7da;
            color: #721c24;
        }
        h1 {
            color: #721c24;
        }
    </style>
</head>
<body>
    <div class="error-container">
        <h1>發生錯誤</h1>
        <p>{{.error}}</p>
        <p>請返回並重試。</p>
    </div>
</body>
</html>

該模板透過 {{.error}} 渲染從控制器傳遞的錯誤資訊,並透過簡單的樣式使其更加易於理解。

4. 使用 Docker 對映靜態資料夾

為了使資料夾的管理更加靈活,並且在容器化應用中實現靜態檔案的持久化儲存,我們可以透過 Docker 將本地資料夾對映到容器內部。

4.1 Docker 對映資料夾

docker-compose.yml 中,我們透過 volumes 選項將主機上的 staticfiles 資料夾對映到容器中的 /app/staticfiles 目錄。

version: '3'
services:
  web:
    image: your-beego-image
    ports:
      - "8080:8080"
    volumes:
      - /d/commanddemo/staticfiles:/app/staticfiles

在這裡,/d/commanddemo/staticfiles 是主機上的資料夾路徑,/app/staticfiles 是容器內部的路徑。透過這種方式,主機和容器中的檔案可以保持同步,任何對檔案的更新都會立即反映在容器內。

5. 執行 Beego 專案

完成上述步驟後,您可以執行 Beego 專案。訪問 http://localhost:8080/getfiles,您將看到目錄中的檔案列表,並可以直接下載這些檔案。

相關文章