>  기사  >  백엔드 개발  >  WebSocket을 사용하여 Golang에 파일을 업로드하는 방법은 무엇입니까?

WebSocket을 사용하여 Golang에 파일을 업로드하는 방법은 무엇입니까?

WBOY
WBOY원래의
2024-06-01 22:20:59332검색

WebSocket을 사용하여 Golang에 파일을 업로드하려면 "github.com/gorilla/websocket" 패키지를 도입하고 WebSocket 라우팅 및 처리 기능을 설정해야 합니다. Gorrila WebSocket 라이브러리를 사용하여 HTTP 연결을 WebSocket 연결로 업그레이드하고 파일 업로드를 처리하기 위한 메시지를 수신합니다. 클라이언트는 WebSocket을 통해 파일을 보내고, 서버는 파일을 받은 후 로컬에 저장합니다. 샘플 코드는 클라이언트 연결 스크립트 및 서버 처리 로직을 포함하여 파일 업로드의 전체 프로세스를 구현하는 방법을 보여줍니다.

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

WebSocket을 사용하여 Golang에서 파일 업로드를 구현하는 방법

WebSocket은 클라이언트와 서버 간의 실시간 양방향 통신을 가능하게 하는 전이중 통신 프로토콜입니다. 채팅, 실시간 데이터 스트리밍, 협업 도구 등 다양한 브라우저 기반 애플리케이션을 구현하는 데 널리 사용됩니다.

Golang에서는 [github.com/gorilla/websocket](https://godoc.org/github.com/gorilla/websocket) 패키지를 사용하여 WebSocket을 쉽게 구현할 수 있습니다. 다음은 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.

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)
    }
}

위 내용은 WebSocket을 사용하여 Golang에 파일을 업로드하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.