diff --git a/TLSharp.Core/Requests/UploadHelper.cs b/TLSharp.Core/Requests/UploadHelper.cs new file mode 100644 index 0000000..74c5f38 --- /dev/null +++ b/TLSharp.Core/Requests/UploadHelper.cs @@ -0,0 +1,120 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Security.Cryptography; +using System.Text; +using System.Threading.Tasks; +using TeleSharp.TL; +using TeleSharp.TL.Upload; +namespace TLSharp.Core.Requests +{ + public class UploadHelper + { + public static async Task Uploader(string name,StreamReader reader,TelegramClient client) + { + if (reader.BaseStream.Length < 10 * 1024 * 1024) + return await SmallFileUpload(name, reader, client); + else + return await BigFileUpload(name, reader, client); + } + private static async Task SmallFileUpload(string name, StreamReader reader, TelegramClient client) + { + var file = new byte[reader.BaseStream.Length]; + reader.BaseStream.Read(file, 0, (int)reader.BaseStream.Length); + string hash; + using (MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider()) + { + hash = Convert.ToBase64String(md5.ComputeHash(file)); + } + reader = null; + var stream = new MemoryStream(file); + Queue parts = new Queue(); + while (!(stream.Position == stream.Length)) + { + if ((stream.Length - stream.Position) > 512 *1024) + { + byte[] temp = new byte[512]; + stream.Read(temp, 0, 512 * 1024); + parts.Enqueue(temp); + } + else + { + byte[] temp = new byte[512]; + stream.Read(temp, 0, (int)(stream.Length - stream.Position)); + parts.Enqueue(temp); + } + } + stream = null; + GC.Collect(); + int partnumber = 0; + long file_id = BitConverter.ToInt64(RandomByteArray(8), 0); + while (parts.Count != 0) + { + var part = parts.Dequeue(); + TLRequestSaveFilePart save = new TLRequestSaveFilePart(); + save.file_id = file_id; + save.file_part = partnumber; + save.bytes = part; + await client.SendRequestAsync(save); + partnumber++; + } + TLInputFile returnFile = new TLInputFile(); + returnFile.id = file_id; + returnFile.name = name; + returnFile.parts = parts.Count; + returnFile.md5_checksum = hash; + return returnFile; + } + private static async Task BigFileUpload(string name, StreamReader reader, TelegramClient client) + { + var file = new byte[reader.BaseStream.Length]; + reader.BaseStream.Read(file, 0, (int)reader.BaseStream.Length); + reader = null; + var stream = new MemoryStream(file); + Queue parts = new Queue(); + while (!(stream.Position == stream.Length)) + { + if ((stream.Length - stream.Position) > 512 * 1024) + { + byte[] temp = new byte[512]; + stream.Read(temp, 0, 512 * 1024); + parts.Enqueue(temp); + } + else + { + byte[] temp = new byte[512]; + stream.Read(temp, 0, (int)(stream.Length - stream.Position)); + parts.Enqueue(temp); + } + } + stream = null; + GC.Collect(); + int partnumber = 0; + long file_id = BitConverter.ToInt64(RandomByteArray(8), 0); + while (parts.Count != 0) + { + var part = parts.Dequeue(); + TLRequestSaveBigFilePart save = new TLRequestSaveBigFilePart(); + save.file_id = file_id; + save.file_part = partnumber; + save.bytes = part; + save.file_total_parts = parts.Count; + await client.SendRequestAsync(save); + partnumber++; + } + TLInputFileBig returnFile = new TLInputFileBig(); + returnFile.id = file_id; + returnFile.name = name; + returnFile.parts = parts.Count; + return returnFile; + } + private static byte[] RandomByteArray(int count) + { + var temp = new byte[count]; + Random random = new Random(); + random.NextBytes(temp); + return temp; + } + } +} diff --git a/TLSharp.Core/TLSharp.Core.csproj b/TLSharp.Core/TLSharp.Core.csproj index de604d1..dda8970 100644 --- a/TLSharp.Core/TLSharp.Core.csproj +++ b/TLSharp.Core/TLSharp.Core.csproj @@ -1,87 +1,88 @@ - - - - - Debug - AnyCPU - {400D2544-1CC6-4D8A-A62C-2292D9947A16} - Library - Properties - TLSharp.Core - TLSharp.Core - v4.5.2 - 512 - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - ..\packages\MarkerMetro.Unity.Ionic.Zlib.2.0.0.14\lib\net35\Ionic.ZLib.dll - True - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {d6144517-91d2-4880-86df-e9ff5d7f383a} - TeleSharp.TL - - - - + + + + + Debug + AnyCPU + {400D2544-1CC6-4D8A-A62C-2292D9947A16} + Library + Properties + TLSharp.Core + TLSharp.Core + v4.5.2 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\packages\MarkerMetro.Unity.Ionic.Zlib.2.0.0.14\lib\net35\Ionic.ZLib.dll + True + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {d6144517-91d2-4880-86df-e9ff5d7f383a} + TeleSharp.TL + + + + \ No newline at end of file