@wilburn
Для отправки файла через 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 42 43 44 45 46 47 48 49 50 51 52 |
package main import ( "fmt" "io/ioutil" "log" "net/http" "os" "github.com/gorilla/websocket" ) var upgrader = websocket.Upgrader{ ReadBufferSize: 1024, WriteBufferSize: 1024, } func handleWebSocket(w http.ResponseWriter, r *http.Request) { conn, err := upgrader.Upgrade(w, r, nil) if err != nil { log.Println("Failed to upgrade WebSocket connection:", err) return } defer conn.Close() for { messageType, message, err := conn.ReadMessage() if err != nil { log.Println("Error while reading message from WebSocket:", err) break } if messageType == websocket.BinaryMessage { // Сохраните полученный файл err := ioutil.WriteFile("file.jpg", message, os.ModePerm) if err != nil { log.Println("Failed to write file:", err) return } log.Println("File saved successfully.") break } } } func main() { http.HandleFunc("/ws", handleWebSocket) log.Println("Server started on http://localhost:8000") log.Fatal(http.ListenAndServe(":8000", nil)) } |
Этот код создает простой HTTP-сервер с обработчиком WebSocket. Когда клиент подключается к ws://localhost:8000/ws
, соединение обновляется до WebSocket, и сервер начинает ожидать получения сообщений. Когда сервер получает сообщение типа BinaryMessage
, он сохраняет содержимое сообщения в файл file.jpg
.
Вы можете использовать любой WebSocket-клиент, чтобы отправить файл на этот сервер, например, JavaScript:
1 2 3 4 5 6 7 |
var socket = new WebSocket("ws://localhost:8000/ws"); var fileInput = document.getElementById('fileInput'); fileInput.addEventListener('change', function(event) { var file = fileInput.files[0]; socket.send(file); }); |
Обратите внимание, что обработчик handleWebSocket
является простым примером и не обрабатывает случаи ошибок или ошибок аутентификации. В реальном приложении вам может потребоваться добавить дополнительную логику для обработки этих случаев.
@wilburn
Необходимо также учитывать, что перед отправкой файла по WebSocket, возможно, потребуется сериализовать файл в формат, который может быть передан через сокет. В приведенном примере, файл отправляется в виде массива байтов, что может дать ошибку, если файл слишком большой. В таких случаях лучше использовать другие способы передачи файлов между сервером и клиентом, например, отправка файла через HTTP POST запрос. В этом случае, сервер может сохранить файл в хранилище и отправить на него ссылку по WebSocket.
Также хорошей практикой является проверка разрешений и безопасности файлов, которые отправляются через WebSocket, чтобы избежать уязвимостей в приложении.