Home  >  Article  >  Backend Development  >  How to use WebSockets to upload files in Golang?

How to use WebSockets to upload files in Golang?

WBOY
WBOYOriginal
2024-06-01 22:20:59396browse

To use WebSockets to upload files in Golang, you need to introduce the "github.com/gorilla/websocket" package and set up WebSocket routing and processing functions. Use the Gorrila WebSocket library to upgrade HTTP connections to WebSocket connections and listen for messages to handle file uploads. The client sends the file via WebSocket, and the server saves the file locally after receiving it. The sample code shows how to implement the complete process of file upload, including client connection script and server processing logic.

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

How to use WebSockets to implement file upload in Golang

WebSocket is a full-duplex communication protocol that can implement client Real-time two-way communication with the server. It is widely used to implement various browser-based applications such as chat, real-time data streaming, and collaboration tools.

In Golang, we can use the [github.com/gorilla/websocket](https://godoc.org/github.com/gorilla/websocket) package to easily implement WebSockets . Here is a step-by-step guide demonstrating how to use Gorrila WebSocket to implement file upload:

1. Introduce the necessary packages

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

    "github.com/gorilla/websocket"
)

2. Set up WebSocket routing

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

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

3. Handle WebSocket connections

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. Provide WebSocket connection scripts to clients

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

Practical Case

The following is a complete example of using the above code to implement file upload 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)
    }
}

The above is the detailed content of How to use WebSockets to upload files in Golang?. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn