Как через websocket отправить файл на golang?

Пользователь

от marisa , в категории: Golang , 2 года назад

Как через websocket отправить файл на golang?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

2 ответа

Пользователь

от maya , 2 года назад

@marisa 

Чтобы отправить файл через WebSocket в Golang, вам нужно выполнить следующие шаги:

  1. Создайте функцию, которая будет отправлять файл через WebSocket:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
func sendFile(conn *websocket.Conn, filePath string) error {
    file, err := os.Open(filePath)
    if err != nil {
        return err
    }
    defer file.Close()

    fileInfo, err := file.Stat()
    if err != nil {
        return err
    }

    fileSize := fileInfo.Size()

    // Отправляем информацию о файле, включая имя и размер, чтобы получатель мог создать файл на своей стороне.
    err = conn.WriteMessage(websocket.BinaryMessage, []byte(fmt.Sprintf("%s:%d", fileInfo.Name(), fileSize)))
    if err != nil {
        return err
    }

    // Отправляем содержимое файла блоками
    bufferSize := 1024
    buffer := make([]byte, bufferSize)

    for {
        bytesRead, err := file.Read(buffer)
        if err != nil {
            if err == io.EOF {
                break
            }
            return err
        }

        err = conn.WriteMessage(websocket.BinaryMessage, buffer[:bytesRead])
        if err != nil {
            return err
        }
    }

    return nil
}


  1. В вашей основной функции откройте WebSocket-соединение и вызовите функцию отправки файла:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
func main() {
    // Открываем WebSocket-соединение
    dialer := websocket.Dialer{}
    conn, _, err := dialer.Dial("ws://localhost:8080/ws", nil)
    if err != nil {
        log.Fatal(err)
    }
    defer conn.Close()

    // Отправляем файл
    err = sendFile(conn, "/path/to/file")
    if err != nil {
        log.Fatal(err)
    }
}


Это отправит файл на сервер, который прослушивает порт 8080 и ожидает WebSocket-соединения на /ws. Вы можете изменить эти параметры в соответствии с вашими требованиями.

Пользователь

от adrien.waters , 4 месяца назад

@marisa 

В примере представлено как открыть файл на сервере и отправить его через вебсокет. Для отправки файла с клиента на сервер через вебсокеты, вам потребуется примерно следующий код:


Сначала установите необходимые пакеты через go get:

1
go get github.com/gorilla/websocket


Далее, в клиентской стороне Golang (например, клиентский скрипт или приложение), вы можете отправить файл через вебсокеты:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package main

import (
	"log"
	"os"
	"github.com/gorilla/websocket"
)

func main() {
	// Установка подключения к серверу
	conn, _, err := websocket.DefaultDialer.Dial("ws://localhost:8080/ws", nil)
	if err != nil {
		log.Fatal("dial:", err)
	}
	defer conn.Close()

	// Открытие файла для отправки
	file, err := os.Open("file.txt")
	if err != nil {
		log.Fatal(err)
	}
	defer file.Close()

	// Отправка файла через вебсокет
	_, err = io.Copy(conn.UnderlyingConn(), file)
	if err != nil {
		log.Fatal(err)
	}
}


На серверной стороне, вам нужно будет принять и обработать данные с клиента. Примерно, это может выглядеть так:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
package main

import (
	"io"
	"net/http"
	"github.com/gorilla/websocket"
)

var upgrader = websocket.Upgrader{
	CheckOrigin: func(r *http.Request) bool {
		return true
	},
}

func handleFileUpload(w http.ResponseWriter, r *http.Request) {
	conn, err := upgrader.Upgrade(w, r, nil)
	if err != nil {
		http.Error(w, "Could not upgrade connection to WebSocket", http.StatusBadRequest)
		return
	}
	defer conn.Close()

	file, _ := os.Create("received_file.txt")
	defer file.Close()

	// Получение и сохранение файла
	_, fileData, err := conn.ReadMessage()
	if err != nil {
		return
	}

	_, err = file.Write(fileData)
	if err != nil {
		return
	}
}

func main() {
	http.HandleFunc("/ws", handleFileUpload)
	http.ListenAndServe(":8080", nil)
}


Это пример рабочего кода, который позволит отправлять файлы через вебсокеты из клиента на сервер в Golang. Обратите внимание, что этот код может потребовать доработки в зависимости от требований вашего проекта.