ホームページ  >  記事  >  バックエンド開発  >  WebSocket を使用して Golang でファイルをアップロードするにはどうすればよいですか?

WebSocket を使用して Golang でファイルをアップロードするにはどうすればよいですか?

WBOY
WBOYオリジナル
2024-06-01 22:20:59398ブラウズ

WebSocket を使用して Golang でファイルをアップロードするには、「github.com/gorilla/websocket」パッケージを導入し、WebSocket のルーティングおよび処理機能を設定する必要があります。 Gorrila WebSocket ライブラリを使用して、HTTP 接続を WebSocket 接続にアップグレードし、ファイルのアップロードを処理するメッセージをリッスンします。クライアントは WebSocket 経由でファイルを送信し、サーバーは受信後にファイルをローカルに保存します。このサンプル コードは、クライアント接続スクリプトやサーバー処理ロジックを含む、ファイル アップロードの完全なプロセスを実装する方法を示しています。

如何在 Golang 中使用 WebSockets 实现文件上传?

WebSocket を使用して Golang でファイルのアップロードを実装する方法

WebSocket は、クライアントとサーバー間のリアルタイムの双方向通信を可能にする全二重通信プロトコルです。チャット、リアルタイム データ ストリーミング、コラボレーション ツールなど、さまざまなブラウザベースのアプリケーションを実装するために広く使用されています。

Golang では、[github.com/gorilla/websocket](https://godoc.org/github.com/gorilla/websocket) パッケージを使用して WebSocket を簡単に実装できます。以下は、Gorrila WebSocket を使用してファイルのアップロードを実装する方法を示すステップバイステップのガイドです:

1. 必要なパッケージを導入します

import (
    "fmt"
    "io"
    "log"
    "net/http"
    "time"

    "github.com/gorilla/websocket"
)

2. WebSocket ルーティングを設定します

// 设置 WebSocket 路由
http.HandleFunc("/upload", handleUpload)

// 监听服务器,端口默认为 :8080
if err := http.ListenAndServe(":8080", nil); err != nil {
    log.Fatal(err)
}

3. WebSocket 接続を処理します。

func handleUpload(w http.ResponseWriter, r *http.Request) {
    ws, err := upgrader.Upgrade(w, r, nil)
    if err != nil {
        log.Fatal(err)
    }
    defer ws.Close()

    for {
        _, _, err := ws.ReadMessage()
        if err != nil {
            if websocket.IsUnexpectedCloseError(err, websocket.CloseGoingAway, websocket.CloseAbnormalClosure) {
                log.Printf("unexpected close error: %v", err)
            }
            break
        }
        
        // 处理文件上传
        // ...
    }
}

4. クライアントに WebSocket 接続スクリプトを提供します

// 客户端 WebSocket 连接脚本
var ws = new WebSocket("ws://localhost:8080/upload");

// 监听消息接收事件
ws.onmessage = function (event) {
  console.log(event.data);
};

// 发送文件
var file = document.querySelector('input[type=file]').files[0];
ws.send(file);

実際のケース

以下は、上記のコードを使用して Golang でファイルのアップロードを実装する完全な例です:

package main

import (
    "fmt"
    "io"
    "log"
    "net/http"
    "os"
    "time"

    "github.com/gorilla/websocket"
)

var upgrader = websocket.Upgrader{
    ReadBufferSize:  1024,
    WriteBufferSize: 1024,
}

func handleUpload(w http.ResponseWriter, r *http.Request) {
    ws, err := upgrader.Upgrade(w, r, nil)
    if err != nil {
        log.Fatal(err)
    }
    defer ws.Close()

    for {
        _, _, err := ws.ReadMessage()
        if err != nil {
            if websocket.IsUnexpectedCloseError(err, websocket.CloseGoingAway, websocket.CloseAbnormalClosure) {
                log.Printf("unexpected close error: %v", err)
            }
            break
        }

        // 处理文件上传
        f, err := os.Create("test.txt")
        if err != nil {
            log.Fatal(err)
        }
        defer f.Close()

        if _, err := io.Copy(f, ws); err != nil {
            log.Fatal(err)
        }

        fmt.Println("文件上传成功")
        if err := ws.WriteMessage(websocket.TextMessage, []byte("文件上传成功")); err != nil {
            log.Fatal(err)
        }
    }
}

func main() {
    // 设置 WebSocket 路由
    http.HandleFunc("/upload", handleUpload)

    // 监听服务器,端口默认为 :8080
    if err := http.ListenAndServe(":8080", nil); err != nil {
        log.Fatal(err)
    }
}

以上がWebSocket を使用して Golang でファイルをアップロードするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。