mirror of
https://github.com/sochix/TLSharp.git
synced 2025-12-06 08:02:00 +01:00
Move upload helper to helpers
This commit is contained in:
parent
6d106b4425
commit
b823c34078
|
|
@ -63,7 +63,7 @@
|
||||||
<Compile Include="Network\TcpTransport.cs" />
|
<Compile Include="Network\TcpTransport.cs" />
|
||||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
<Compile Include="Requests\AckRequest.cs" />
|
<Compile Include="Requests\AckRequest.cs" />
|
||||||
<Compile Include="Requests\UploadHelper.cs" />
|
<Compile Include="Utils\UploadHelper.cs" />
|
||||||
<Compile Include="Session.cs" />
|
<Compile Include="Session.cs" />
|
||||||
<Compile Include="TelegramClient.cs" />
|
<Compile Include="TelegramClient.cs" />
|
||||||
<Compile Include="Utils\Helpers.cs" />
|
<Compile Include="Utils\Helpers.cs" />
|
||||||
|
|
|
||||||
|
|
@ -1,136 +1,135 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Security.Cryptography;
|
using System.Security.Cryptography;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using TeleSharp.TL;
|
using TeleSharp.TL;
|
||||||
using TeleSharp.TL.Upload;
|
using TeleSharp.TL.Upload;
|
||||||
using TLSharp.Core.Utils;
|
|
||||||
|
namespace TLSharp.Core.Utils
|
||||||
namespace TLSharp.Core.Requests
|
{
|
||||||
{
|
public static class UploadHelper
|
||||||
public static class UploadHelper
|
{
|
||||||
{
|
private static string GetFileHash(byte[] data)
|
||||||
private static string GetFileHash(byte[] data)
|
{
|
||||||
{
|
string md5_checksum;
|
||||||
string md5_checksum;
|
using (var md5 = MD5.Create())
|
||||||
using (var md5 = MD5.Create())
|
{
|
||||||
{
|
var hash = md5.ComputeHash(data);
|
||||||
var hash = md5.ComputeHash(data);
|
var hashResult = new StringBuilder(hash.Length * 2);
|
||||||
var hashResult = new StringBuilder(hash.Length * 2);
|
|
||||||
|
foreach (byte t in hash)
|
||||||
foreach (byte t in hash)
|
hashResult.Append(t.ToString("x2"));
|
||||||
hashResult.Append(t.ToString("x2"));
|
|
||||||
|
md5_checksum = hashResult.ToString();
|
||||||
md5_checksum = hashResult.ToString();
|
}
|
||||||
}
|
|
||||||
|
return md5_checksum;
|
||||||
return md5_checksum;
|
}
|
||||||
}
|
|
||||||
|
public static async Task<TLAbsInputFile> UploadFile(this TelegramClient client, string name, StreamReader reader)
|
||||||
public static async Task<TLAbsInputFile> UploadFile(this TelegramClient client, string name, StreamReader reader)
|
{
|
||||||
{
|
const long tenMb = 10 * 1024 * 1024;
|
||||||
const long tenMb = 10 * 1024 * 1024;
|
return await UploadFile(name, reader, client, reader.BaseStream.Length >= tenMb);
|
||||||
return await UploadFile(name, reader, client, reader.BaseStream.Length >= tenMb);
|
}
|
||||||
}
|
|
||||||
|
private static byte[] GetFile(StreamReader reader)
|
||||||
private static byte[] GetFile(StreamReader reader)
|
{
|
||||||
{
|
var file = new byte[reader.BaseStream.Length];
|
||||||
var file = new byte[reader.BaseStream.Length];
|
|
||||||
|
using (reader)
|
||||||
using (reader)
|
{
|
||||||
{
|
reader.BaseStream.Read(file, 0, (int)reader.BaseStream.Length);
|
||||||
reader.BaseStream.Read(file, 0, (int)reader.BaseStream.Length);
|
}
|
||||||
}
|
|
||||||
|
return file;
|
||||||
return file;
|
}
|
||||||
}
|
|
||||||
|
private static Queue<byte[]> GetFileParts(byte[] file)
|
||||||
private static Queue<byte[]> GetFileParts(byte[] file)
|
{
|
||||||
{
|
var fileParts = new Queue<byte[]>();
|
||||||
var fileParts = new Queue<byte[]>();
|
|
||||||
|
const int maxFilePart = 512 * 1024;
|
||||||
const int maxFilePart = 512 * 1024;
|
|
||||||
|
using (var stream = new MemoryStream(file))
|
||||||
using (var stream = new MemoryStream(file))
|
{
|
||||||
{
|
while (stream.Position != stream.Length)
|
||||||
while (stream.Position != stream.Length)
|
{
|
||||||
{
|
if ((stream.Length - stream.Position) > maxFilePart)
|
||||||
if ((stream.Length - stream.Position) > maxFilePart)
|
{
|
||||||
{
|
var temp = new byte[maxFilePart];
|
||||||
var temp = new byte[maxFilePart];
|
stream.Read(temp, 0, maxFilePart);
|
||||||
stream.Read(temp, 0, maxFilePart);
|
fileParts.Enqueue(temp);
|
||||||
fileParts.Enqueue(temp);
|
}
|
||||||
}
|
else
|
||||||
else
|
{
|
||||||
{
|
var length = stream.Length - stream.Position;
|
||||||
var length = stream.Length - stream.Position;
|
var temp = new byte[length];
|
||||||
var temp = new byte[length];
|
stream.Read(temp, 0, (int)(length));
|
||||||
stream.Read(temp, 0, (int)(length));
|
fileParts.Enqueue(temp);
|
||||||
fileParts.Enqueue(temp);
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
return fileParts;
|
||||||
return fileParts;
|
}
|
||||||
}
|
|
||||||
|
private static async Task<TLAbsInputFile> UploadFile(string name, StreamReader reader,
|
||||||
private static async Task<TLAbsInputFile> UploadFile(string name, StreamReader reader,
|
TelegramClient client, bool isBigFileUpload)
|
||||||
TelegramClient client, bool isBigFileUpload)
|
{
|
||||||
{
|
var file = GetFile(reader);
|
||||||
var file = GetFile(reader);
|
var fileParts = GetFileParts(file);
|
||||||
var fileParts = GetFileParts(file);
|
|
||||||
|
int partNumber = 0;
|
||||||
int partNumber = 0;
|
int partsCount = fileParts.Count;
|
||||||
int partsCount = fileParts.Count;
|
long file_id = BitConverter.ToInt64(Helpers.GenerateRandomBytes(8), 0);
|
||||||
long file_id = BitConverter.ToInt64(Helpers.GenerateRandomBytes(8), 0);
|
while (fileParts.Count != 0)
|
||||||
while (fileParts.Count != 0)
|
{
|
||||||
{
|
var part = fileParts.Dequeue();
|
||||||
var part = fileParts.Dequeue();
|
|
||||||
|
if (isBigFileUpload)
|
||||||
if (isBigFileUpload)
|
{
|
||||||
{
|
await client.SendRequestAsync<bool>(new TLRequestSaveBigFilePart
|
||||||
await client.SendRequestAsync<bool>(new TLRequestSaveBigFilePart
|
{
|
||||||
{
|
file_id = file_id,
|
||||||
file_id = file_id,
|
file_part = partNumber,
|
||||||
file_part = partNumber,
|
bytes = part,
|
||||||
bytes = part,
|
file_total_parts = partsCount
|
||||||
file_total_parts = partsCount
|
});
|
||||||
});
|
}
|
||||||
}
|
else
|
||||||
else
|
{
|
||||||
{
|
await client.SendRequestAsync<bool>(new TLRequestSaveFilePart
|
||||||
await client.SendRequestAsync<bool>(new TLRequestSaveFilePart
|
{
|
||||||
{
|
file_id = file_id,
|
||||||
file_id = file_id,
|
file_part = partNumber,
|
||||||
file_part = partNumber,
|
bytes = part
|
||||||
bytes = part
|
});
|
||||||
});
|
}
|
||||||
}
|
partNumber++;
|
||||||
partNumber++;
|
}
|
||||||
}
|
|
||||||
|
if (isBigFileUpload)
|
||||||
if (isBigFileUpload)
|
{
|
||||||
{
|
return new TLInputFileBig
|
||||||
return new TLInputFileBig
|
{
|
||||||
{
|
id = file_id,
|
||||||
id = file_id,
|
name = name,
|
||||||
name = name,
|
parts = partsCount
|
||||||
parts = partsCount
|
};
|
||||||
};
|
}
|
||||||
}
|
else
|
||||||
else
|
{
|
||||||
{
|
return new TLInputFile
|
||||||
return new TLInputFile
|
{
|
||||||
{
|
id = file_id,
|
||||||
id = file_id,
|
name = name,
|
||||||
name = name,
|
parts = partsCount,
|
||||||
parts = partsCount,
|
md5_checksum = GetFileHash(file)
|
||||||
md5_checksum = GetFileHash(file)
|
};
|
||||||
};
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
@ -12,6 +12,7 @@ using TeleSharp.TL;
|
||||||
using TeleSharp.TL.Messages;
|
using TeleSharp.TL.Messages;
|
||||||
using TLSharp.Core;
|
using TLSharp.Core;
|
||||||
using TLSharp.Core.Requests;
|
using TLSharp.Core.Requests;
|
||||||
|
using TLSharp.Core.Utils;
|
||||||
|
|
||||||
namespace TLSharp.Tests
|
namespace TLSharp.Tests
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue