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
,您將看到目錄中的檔案列表,並可以直接下載這些檔案。