Golang で Google ドライブ ダウンローダーを構築する (パート 1)

Patricia Arquette
リリース: 2024-09-30 06:24:02
オリジナル
449 人が閲覧しました

Building a Google Drive Downloader in Golang (Part 1)

介紹

在本教程中,我們將建立一個功能強大的下載器,允許從 Google Drive 和其他雲端提供者下載檔案。借助 Golang 高效的並發模式,您將能夠同時管理多個下載、串流大檔案並即時追蹤進度。無論您是下載一些小檔案還是處理大型資料集,該專案都將展示如何建立可擴展且強大的下載器,該下載器可以輕鬆擴展以支援多個雲端平台。

如果您正在尋找一種簡化和自動下載大檔案的方法,本教學非常適合您。最後,您將擁有一個靈活且可自訂的基於 Go 的下載器來滿足您的需求。

匆忙?

如果您只是想在 UI 中使用此下載器,請訪問 evolvasdev.com 閱讀完整文章和 Go Downloader 的 Github。您將找到讓它快速運行的文件。

你將學到什麼

  • Go 並發模式:
    了解如何使用 Goroutines、通道和互斥體來有效處理多個並發檔案下載。

  • 串流大量下載:
    探索如何在有效管理記憶體和系統資源的同時傳輸大檔案。

  • 並發檔案下載:
    了解如何同時下載文件,加快進程並提高效能。

  • 即時進度更新:
    實施進度追蹤以提供下載狀態的即時回饋。

  • 處理中斷與取消:
    了解如何優雅地取消一項或所有正在進行的下載。

注意:本教學只專注於核心下載邏輯。

環境設定

在做任何事情之前,請先確保正確設定您的環境,以避免將來出現潛在的錯誤。

先決條件

  • 安裝Go
  • AIR 用來自動重新載入
  • Makefile 執行複雜指令
  • Goose 用於 PostgreSQL 遷移

配置Makefile

使用下列內容在專案的根目錄中建立一個 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 資料夾 api.go 和 Route.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")
    })
}
ログイン後にコピー

api.go 檔案設定

在這裡,我們將在啟動伺服器之前添加所有必要的中間件,例如 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 の処理、将来の拡張のための基盤の構築などの主要なコンポーネントをカバーしました。その過程で、いくつかの重要なトピックについて触れました:

  • Goose を使用した データベース移行により、スムーズでスケーラブルなデータ管理を実現します。
  • 将来追加のクラウド ストレージ プロバイダーのサポートを簡単に拡張できるように、プロバイダー レジストリを構築します。
  • 将来的により複雑なロジックを簡単に処理できる柔軟なアーキテクチャを設計します。

かなり長くなってしまったので、1 つの投稿にはこれで十分です。 パート 2 に戻って作業を完了し、主なダウンロード機能を作業します。

それまでは、GitHub で現在の実装を自由に探索し、次のステップに注目してください。ダウンロードを楽しんでください!

以上がGolang で Google ドライブ ダウンローダーを構築する (パート 1)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート