Heim  >  Artikel  >  Backend-Entwicklung  >  Wie verwende ich WebSockets zum Hochladen von Dateien in Golang?

Wie verwende ich WebSockets zum Hochladen von Dateien in Golang?

WBOY
WBOYOriginal
2024-06-01 22:20:59331Durchsuche

Um WebSockets zum Hochladen von Dateien in Golang zu verwenden, müssen Sie das Paket „github.com/gorilla/websocket“ einführen und WebSocket-Routing- und Verarbeitungsfunktionen einrichten. Verwenden Sie die Gorrila WebSocket-Bibliothek, um HTTP-Verbindungen auf WebSocket-Verbindungen zu aktualisieren und auf Nachrichten zu warten, um Datei-Uploads zu verarbeiten. Der Client sendet die Datei über WebSocket und der Server speichert die Datei nach dem Empfang lokal. Der Beispielcode zeigt, wie der gesamte Prozess des Datei-Uploads implementiert wird, einschließlich Client-Verbindungsskript und Serververarbeitungslogik.

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

So verwenden Sie WebSockets zum Implementieren des Datei-Uploads in Golang

WebSocket ist ein Vollduplex-Kommunikationsprotokoll, das eine bidirektionale Echtzeitkommunikation zwischen dem Client und dem Server ermöglicht. Es wird häufig zur Implementierung verschiedener browserbasierter Anwendungen wie Chat, Echtzeit-Datenstreaming und Tools für die Zusammenarbeit verwendet.

In Golang können wir das Paket [github.com/gorilla/websocket](https://godoc.org/github.com/gorilla/websocket) verwenden, um WebSockets einfach zu implementieren. Hier ist eine Schritt-für-Schritt-Anleitung, die zeigt, wie Sie Gorrila WebSocket zum Implementieren von Datei-Uploads verwenden:

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

    "github.com/gorilla/websocket"
)
2. WebSocket-Routing einrichten

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

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

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. Stellen Sie ein WebSocket-Verbindungsskript für den Client bereit

// 客户端 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);

Praktischer Fall

Das Folgende ist ein vollständiges Beispiel für die Verwendung des obigen Codes zum Implementieren des Datei-Uploads in 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)
    }
}

Das obige ist der detaillierte Inhalt vonWie verwende ich WebSockets zum Hochladen von Dateien in Golang?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn