在本教程中,我們將建立一個功能強大的下載器,允許從 Google Drive 和其他雲端提供者下載檔案。借助 Golang 高效的並發模式,您將能夠同時管理多個下載、串流大檔案並即時追蹤進度。無論您是下載一些小檔案還是處理大型資料集,該專案都將展示如何建立可擴展且強大的下載器,該下載器可以輕鬆擴展以支援多個雲端平台。
如果您正在尋找一種簡化和自動下載大檔案的方法,本教學非常適合您。最後,您將擁有一個靈活且可自訂的基於 Go 的下載器來滿足您的需求。
如果您只是想在 UI 中使用此下載器,請訪問 evolvasdev.com 閱讀完整文章和 Go Downloader 的 Github。您將找到讓它快速運行的文件。
Go 並發模式:
了解如何使用 Goroutines、通道和互斥體來有效處理多個並發檔案下載。
串流大量下載:
探索如何在有效管理記憶體和系統資源的同時傳輸大檔案。
並發檔案下載:
了解如何同時下載文件,加快進程並提高效能。
即時進度更新:
實施進度追蹤以提供下載狀態的即時回饋。
處理中斷與取消:
了解如何優雅地取消一項或所有正在進行的下載。
注意:本教學只專注於核心下載邏輯。
在做任何事情之前,請先確保正確設定您的環境,以避免將來出現潛在的錯誤。
使用下列內容在專案的根目錄中建立一個 makefile。
# Load environment variables from .env file include ./.env # To run the application run: build @./bin/go-downloader # Build the application build: @go build -tags '!dev' -o bin/go-downloader # Database migration status db-status: @GOOSE_DRIVER=postgres GOOSE_DBSTRING=$(DB_URL) goose -dir=$(migrationPath) status # Run database migrations up: @GOOSE_DRIVER=postgres GOOSE_DBSTRING=$(DB_URL) goose -dir=$(migrationPath) up # Roll back the last database migration down: @GOOSE_DRIVER=postgres GOOSE_DBSTRING=$(DB_URL) goose -dir=$(migrationPath) down # Reset database migrations reset: @GOOSE_DRIVER=postgres GOOSE_DBSTRING=$(DB_URL) goose -dir=$(migrationPath) reset
go-downloader/ ├── api ├── config ├── migrations ├── service ├── setting ├── store ├── types ├── util ├── .env ├── .air.toml ├── Makefile ├── go.mod ├── go.sum └── main.go
根據需要在根目錄中建立 .env 檔案或處理環境變量,我們將使用 joho/godotenv 套件。
GOOGLE_CLIENT_ID GOOGLE_CLIENT_SECRET SESSION_SECRET=something-super-secret APP_URL=http://localhost:3000 POSTGRES_USER POSTGRES_PASSWORD POSTGRES_DB
我們現在將開始建立 Web 伺服器來處理所有傳入請求。
注意! 本指南的主要部分從這裡開始。準備好潛入水中吧!
首先,在 api 資料夾 api.go 和 Route.go 中建立以下檔案
所有API 路由 都將在此定義。我們建立一個採用 env 配置的 NewRouter 結構,讓所有路由和處理程序存取環境變數。
package api import ( "github.com/gofiber/fiber/v2" "github.com/nilotpaul/go-downloader/config" ) type Router struct { env config.EnvConfig } func NewRouter(env config.EnvConfig) *Router { return &Router{ env: env, } } func (h *Router) RegisterRoutes(r fiber.Router) { r.Get("/healthcheck", func(c *fiber.Ctx) error { return c.JSON("OK") }) }
在這裡,我們將在啟動伺服器之前添加所有必要的中間件,例如 CORS 和日誌記錄。
type APIServer struct { listenAddr string env config.EnvConfig } func NewAPIServer(listenAddr string, env config.EnvConfig) *APIServer { return &APIServer{ listenAddr: listenAddr, env: env, } } func (s *APIServer) Start() error { app := fiber.New(fiber.Config{ AppName: "Go Downloader", }) handler := NewRouter() handler.RegisterRoutes(app) log.Printf("Server started on http://localhost:%s", s.listenAddr) return app.Listen(":" + s.listenAddr) }
這是 main.go 檔案中的主包,它將作為整體的入口點。
func main() { // Loads all Env vars from .env file. env := config.MustLoadEnv() log.Fatal(s.Start()) }
這足以啟動伺服器並測試它。
air
就這樣了。 ?
curl http://localhost:3000/healthcheck
反應應該正常,狀態為 200
我們需要實施一個可擴展的解決方案,以便在必要時添加對多個雲端供應商的支援。
// Better to keep it in a seperate folder. // Specific only to OAuth Providers. type OAuthProvider interface { Authenticate(string) error GetAccessToken() string GetRefreshToken() string RefreshToken(*fiber.Ctx, string, bool) (*oauth2.Token, error) IsTokenValid() bool GetAuthURL(state string) string CreateOrUpdateAccount() (string, error) CreateSession(c *fiber.Ctx, userID string) error UpdateTokens(*GoogleAccount) error } type ProviderRegistry struct { Providers map[string]OAuthProvider } func NewProviderRegistry() *ProviderRegistry { return &ProviderRegistry{ Providers: make(map[string]OAuthProvider), } } func (r *ProviderRegistry) Register(providerName string, p OAuthProvider) { r.Providers[providerName] = p } func (r *ProviderRegistry) GetProvider(providerName string) (OAuthProvider, error) { p, exists := r.Providers[providerName] if !exists { return nil, fmt.Errorf("Provider not found") } return p, nil }
ProviderRegistry 充當中央映射來保存我們所有的 OAuth 提供者。當我們初始化我們的提供者時,我們將在這個映射中註冊它們。這使我們能夠在整個服務過程中輕鬆存取任何註冊提供者的功能。
稍後您會看到此操作。
我們將根據提供的環境變數註冊我們的提供者。
func InitStore(env config.EnvConfig) *ProviderRegistry { r := NewProviderRegistry() if len(env.GoogleClientSecret) != 0 || len(env.GoogleClientID) != 0 { googleProvider := NewGoogleProvider(googleProviderConfig{ googleClientID: env.GoogleClientID, googleClientSecret: env.GoogleClientSecret, googleRedirectURL: env.AppURL + "/callback/google", }, env) r.Register("google", googleProvider) } return r }
在這裡閱讀全文。
私たちは Go の Google ドライブ ダウンローダー の基礎を築き、プロジェクト構造のセットアップ、Google OAuth の処理、将来の拡張のための基盤の構築などの主要なコンポーネントをカバーしました。その過程で、いくつかの重要なトピックについて触れました:
かなり長くなってしまったので、1 つの投稿にはこれで十分です。 パート 2 に戻って作業を完了し、主なダウンロード機能を作業します。
それまでは、GitHub で現在の実装を自由に探索し、次のステップに注目してください。ダウンロードを楽しんでください!
以上がGolang で Google ドライブ ダウンローダーを構築する (パート 1)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。