Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk menggunakan WebSockets untuk memuat naik fail di Golang?

Bagaimana untuk menggunakan WebSockets untuk memuat naik fail di Golang?

WBOY
WBOYasal
2024-06-01 22:20:59420semak imbas

Untuk menggunakan WebSockets untuk memuat naik fail dalam Golang, anda perlu memperkenalkan pakej "github.com/gorilla/websocket" dan menyediakan fungsi penghalaan dan pemprosesan WebSocket. Gunakan perpustakaan WebSocket Gorrila untuk menaik taraf sambungan HTTP kepada sambungan WebSocket dan mendengar mesej untuk mengendalikan muat naik fail. Pelanggan menghantar fail melalui WebSocket, dan pelayan menyimpan fail secara setempat selepas menerimanya. Kod sampel menunjukkan cara melaksanakan proses lengkap muat naik fail, termasuk skrip sambungan klien dan logik pemprosesan pelayan.

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

Cara menggunakan WebSockets untuk melaksanakan muat naik fail dalam Golang

WebSocket ialah protokol komunikasi dupleks penuh yang membolehkan komunikasi dua hala masa nyata antara pelanggan dan pelayan. Ia digunakan secara meluas untuk melaksanakan pelbagai aplikasi berasaskan pelayar seperti sembang, penstriman data masa nyata dan alatan kerjasama.

Di Golang, kami boleh menggunakan pakej [github.com/gorilla/websocket](https://godoc.org/github.com/gorilla/websocket) untuk melaksanakan WebSockets dengan mudah. Berikut ialah panduan langkah demi langkah yang menunjukkan cara menggunakan Gorrila WebSocket untuk melaksanakan muat naik fail:

1. Perkenalkan pakej yang diperlukan

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

    "github.com/gorilla/websocket"
)

2. Sediakan penghalaan WebSocket

// 设置 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. Sediakan skrip sambungan WebSocket kepada pelanggan

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

Berikut adalah contoh lengkap menggunakan kod di atas untuk melaksanakan muat naik fail di 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)
    }
}

Atas ialah kandungan terperinci Bagaimana untuk menggunakan WebSockets untuk memuat naik fail di Golang?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn