Maison  >  Article  >  développement back-end  >  Comment utiliser WebSockets pour télécharger des fichiers dans Golang ?

Comment utiliser WebSockets pour télécharger des fichiers dans Golang ?

WBOY
WBOYoriginal
2024-06-01 22:20:59400parcourir

Pour utiliser WebSockets pour télécharger des fichiers dans Golang, vous devez introduire le package "github.com/gorilla/websocket" et configurer les fonctions de routage et de traitement WebSocket. Utilisez la bibliothèque Gorrila WebSocket pour mettre à niveau les connexions HTTP vers des connexions WebSocket et écouter les messages pour gérer les téléchargements de fichiers. Le client envoie le fichier via WebSocket et le serveur enregistre le fichier localement après l'avoir reçu. L'exemple de code montre comment implémenter le processus complet de téléchargement de fichiers, y compris le script de connexion client et la logique de traitement du serveur.

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

Comment utiliser WebSockets pour implémenter le téléchargement de fichiers dans Golang

WebSocket est un protocole de communication full-duplex qui permet une communication bidirectionnelle en temps réel entre le client et le serveur. Il est largement utilisé pour implémenter diverses applications basées sur un navigateur telles que le chat, le streaming de données en temps réel et les outils de collaboration.

Dans Golang, nous pouvons utiliser le package [github.com/gorilla/websocket](https://godoc.org/github.com/gorilla/websocket) pour implémenter facilement WebSockets. Voici un guide étape par étape montrant comment utiliser Gorrila WebSocket pour implémenter les téléchargements de fichiers :

1 Introduire les packages nécessaires

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

    "github.com/gorilla/websocket"
)

2 Configurer le routage WebSocket

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

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

3.

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. Fournir un script de connexion WebSocket pour le client

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

Cas pratique

Ce qui suit est un exemple complet d'utilisation du code ci-dessus pour implémenter le téléchargement de fichiers dans 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)
    }
}

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn