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)
		},
	}
  • Вопрос задан
  • 512 просмотров
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
А ничего, что ты переоткрываешь файл на каждом принятом фрагменте?
Вследствие чего предыдущее содержимое файла затирается.
Открывай файл один раз, при начале приёма, и держи открытым, пока не закончишь принимать файл или пока не произойдёт ошибка.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы