From c059ebf208d230ff975d459f745163963656d21a Mon Sep 17 00:00:00 2001 From: Wizou <11647984+wiz0u@users.noreply.github.com> Date: Thu, 19 Oct 2023 23:57:45 +0200 Subject: [PATCH] UploadFileAsync now supports Stream with unknown Length (!CanSeek) --- src/Client.Helpers.cs | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/Client.Helpers.cs b/src/Client.Helpers.cs index 8047a3b..9c7eafa 100644 --- a/src/Client.Helpers.cs +++ b/src/Client.Helpers.cs @@ -38,19 +38,27 @@ namespace WTelegram using var md5 = MD5.Create(); using (stream) { - long transmitted = 0, length = stream.Length; - var isBig = length >= 10 * 1024 * 1024; - int file_total_parts = (int)((length - 1) / FilePartSize) + 1; + bool hasLength = stream.CanSeek; + long transmitted = 0, length = hasLength ? stream.Length : -1; + bool isBig = hasLength ? length >= 10 * 1024 * 1024 : true; + int file_total_parts = hasLength ? (int)((length - 1) / FilePartSize) + 1 : -1; long file_id = Helpers.RandomLong(); int file_part = 0, read; var tasks = new Dictionary(); bool abort = false; - for (long bytesLeft = length; !abort && bytesLeft != 0; file_part++) + for (long bytesLeft = hasLength ? length : long.MaxValue; !abort && bytesLeft != 0; file_part++) { var bytes = new byte[Math.Min(FilePartSize, bytesLeft)]; read = await stream.FullReadAsync(bytes, bytes.Length, default); await _parallelTransfers.WaitAsync(); bytesLeft -= read; + if (!hasLength && read < bytes.Length) + { + file_total_parts = file_part; + if (read == 0) break; else file_total_parts++; + bytes = bytes[..read]; + bytesLeft = 0; + } var task = SavePart(file_part, bytes); lock (tasks) tasks[file_part] = task; if (!isBig)