首頁  >  文章  >  後端開發  >  如何在 Golang 中使用 WebSockets 實作文件上傳?

如何在 Golang 中使用 WebSockets 實作文件上傳?

WBOY
WBOY原創
2024-06-01 22:20:59398瀏覽

在 Golang 中使用 WebSockets 實作檔案上傳,需要引入 "github.com/gorilla/websocket" 套件,設定 WebSocket 路由和處理函數。使用 Gorrila WebSocket 庫升級 HTTP 連接到 WebSocket 連接,並監聽訊息以處理文件上傳。客戶端透過 WebSocket 發送文件,伺服器在收到文件後將其儲存到本機。範例程式碼展示如何實現文件上傳的完整流程,包括客戶端連接腳本和伺服器處理邏輯。

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

如何在Golang 中使用WebSockets 實作檔案上傳

WebSocket 是一種全雙工通訊協議,可實現客戶端和伺服器之間的即時雙向通訊。它廣泛用於實現各種基於瀏覽器的應用程序,如聊天、即時數據流和協作工具。

在Golang 中,我們可以使用[github.com/gorilla/websocket](https://godoc.org/github.com/gorilla/websocket) 套件來輕鬆實現WebSockets 。以下是逐步指南,示範如何使用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)
    }
}

以上是如何在 Golang 中使用 WebSockets 實作文件上傳?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn