@marisa
Чтобы отправить файл через 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 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 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
. Вы можете изменить эти параметры в соответствии с вашими требованиями.
@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. Обратите внимание, что этот код может потребовать доработки в зависимости от требований вашего проекта.