chigan0
@chigan0
back end developer

Как передать объёмные файлы через websocket?

Всем доброго дня, стоит такая задача сделать не большой сервис который будет принимать видео файлы по websocket, размер файла до 10 гб. Я реализовал передачу файлов от клиента к серверу но файлы приходят не полные, к примеру вместо 159 кб пришло 4.9 кб

Сервер
@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):
	await websocket.accept()

	while True:
		try:
			filename = 'example.mp4'
			file = await websocket.receive_bytes()

			with open(f'test_video/{filename}', 'wb') as f:
				 f.write(file)


Клиент
mounted(){
		let sock = new WebSocket("ws://localhost:5000/ws");
		sock.binaryType = "arraybuffer";
		this.sock = sock;

		sock.onopen = function(){
			console.log('Сойдинения установленно')
		}

	},
	methods:{
		shareFile(metadata, buffer, sock){
			sock.send(JSON.stringify(metadata))
			let state = true;

			while (state) {
				let chunk = buffer.slice(0, metadata.buffer_size);
				buffer = buffer.slice(metadata.buffer_size, buffer.length);

				if (chunk.length > 0){
					sock.send(chunk);
				}
				else
					state = false;
			}
		},

		videoUpload(){
			let uploadeVidio = this.$refs.file.files[0];
			let reader = new FileReader();
			
			reader.onload = ()=>{
				let buffer = new Uint8Array(reader.result);
				
				this.shareFile({
					filename: uploadeVidio.name,
					total_buffer_size: buffer.length,
					buffer_size: 2048
				}, 
				buffer, this.sock);

			}

			reader.readAsArrayBuffer(uploadeVidio)
		},
	}
  • Вопрос задан
  • 105 просмотров
Решения вопроса 1
Vindicar
@Vindicar
А ничего, что ты переоткрываешь файл на каждом принятом фрагменте?
Вследствие чего предыдущее содержимое файла затирается.
Открывай файл один раз, при начале приёма, и держи открытым, пока не закончишь принимать файл или пока не произойдёт ошибка.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы