Создаём класс: MultipartFormBuilder.cs namespace TelegramSenderEx { using System; using System.Collections.Generic; using System.IO; using System.Text; public class MultipartFormBuilder { // https://gist.github.com/ericvoid/568d733c90857f010fb860cb5e6aba43 private static readonly string MultipartContentType = "multipart/form-data; boundary="; private static readonly string FileHeaderTemplate = "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\nContent-Type: application/octet-stream\r\n\r\n"; private static readonly string FormDataTemplate = "\r\n--{0}\r\nContent-Disposition: form-data; name=\"{1}\";\r\n\r\n{2}"; public string ContentType { get; private set; } private string Boundary { get; set; } Dictionary<string, FileInfo> FilesToSend { get; set; } = new Dictionary<string, FileInfo>(); Dictionary<string, string> FieldsToSend { get; set; } = new Dictionary<string, string>(); public MultipartFormBuilder() { Boundary = $"----------------------------{DateTime.Now.Ticks:x}"; ContentType = $"{MultipartContentType}{Boundary}"; } public void AddField(string key, string value) => FieldsToSend.Add(key, value); public void AddFile(FileInfo file) { string key = file.Extension.Substring(1); FilesToSend.Add(key, file); } public void AddFile(string key, FileInfo file) => FilesToSend.Add(key, file); public MemoryStream GetStream() { using var memStream = new MemoryStream(); WriteFields(memStream); WriteStreams(memStream); WriteTrailer(memStream); memStream.Seek(0, SeekOrigin.Begin); return memStream; } private void WriteFields(Stream stream) { if (FieldsToSend.Count != 0) { foreach (KeyValuePair<string, string> fieldEntry in FieldsToSend) { string content = string.Format(FormDataTemplate, Boundary, fieldEntry.Key, fieldEntry.Value); using var fieldData = new MemoryStream(Encoding.UTF8.GetBytes(content)); fieldData.CopyTo(stream); } } } private void WriteStreams(Stream stream) { if (FilesToSend.Count != 0) { foreach (KeyValuePair<string, FileInfo> fileEntry in FilesToSend) { WriteBoundary(stream); string header = string.Format(FileHeaderTemplate, fileEntry.Key, fileEntry.Value.Name); byte[] headerbytes = Encoding.UTF8.GetBytes(header); stream.Write(headerbytes, 0, headerbytes.Length); using FileStream fileData = File.OpenRead(fileEntry.Value.FullName); fileData?.CopyTo(stream); } } } private void WriteBoundary(Stream stream) { byte[] boundarybytes = Encoding.UTF8.GetBytes($"\r\n--{Boundary}\r\n"); stream.Write(boundarybytes, 0, boundarybytes.Length); } private void WriteTrailer(Stream stream) { byte[] trailer = Encoding.UTF8.GetBytes($"\r\n--{Boundary}--\r\n"); stream.Write(trailer, 0, trailer.Length); } } } Код namespace TelegramSenderEx { using System; using System.Collections.Generic; using System.IO; using System.Text; public class MultipartFormBuilder { // https://gist.github.com/ericvoid/568d733c90857f010fb860cb5e6aba43 private static readonly string MultipartContentType = "multipart/form-data; boundary="; private static readonly string FileHeaderTemplate = "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\nContent-Type: application/octet-stream\r\n\r\n"; private static readonly string FormDataTemplate = "\r\n--{0}\r\nContent-Disposition: form-data; name=\"{1}\";\r\n\r\n{2}"; public string ContentType { get; private set; } private string Boundary { get; set; } Dictionary<string, FileInfo> FilesToSend { get; set; } = new Dictionary<string, FileInfo>(); Dictionary<string, string> FieldsToSend { get; set; } = new Dictionary<string, string>(); public MultipartFormBuilder() { Boundary = $"----------------------------{DateTime.Now.Ticks:x}"; ContentType = $"{MultipartContentType}{Boundary}"; } public void AddField(string key, string value) => FieldsToSend.Add(key, value); public void AddFile(FileInfo file) { string key = file.Extension.Substring(1); FilesToSend.Add(key, file); } public void AddFile(string key, FileInfo file) => FilesToSend.Add(key, file); public MemoryStream GetStream() { using var memStream = new MemoryStream(); WriteFields(memStream); WriteStreams(memStream); WriteTrailer(memStream); memStream.Seek(0, SeekOrigin.Begin); return memStream; } private void WriteFields(Stream stream) { if (FieldsToSend.Count != 0) { foreach (KeyValuePair<string, string> fieldEntry in FieldsToSend) { string content = string.Format(FormDataTemplate, Boundary, fieldEntry.Key, fieldEntry.Value); using var fieldData = new MemoryStream(Encoding.UTF8.GetBytes(content)); fieldData.CopyTo(stream); } } } private void WriteStreams(Stream stream) { if (FilesToSend.Count != 0) { foreach (KeyValuePair<string, FileInfo> fileEntry in FilesToSend) { WriteBoundary(stream); string header = string.Format(FileHeaderTemplate, fileEntry.Key, fileEntry.Value.Name); byte[] headerbytes = Encoding.UTF8.GetBytes(header); stream.Write(headerbytes, 0, headerbytes.Length); using FileStream fileData = File.OpenRead(fileEntry.Value.FullName); fileData?.CopyTo(stream); } } } private void WriteBoundary(Stream stream) { byte[] boundarybytes = Encoding.UTF8.GetBytes($"\r\n--{Boundary}\r\n"); stream.Write(boundarybytes, 0, boundarybytes.Length); } private void WriteTrailer(Stream stream) { byte[] trailer = Encoding.UTF8.GetBytes($"\r\n--{Boundary}--\r\n"); stream.Write(trailer, 0, trailer.Length); } } } И ещё один класс помощник: WebClientExtensionMethods.cs namespace TelegramSenderEx { using System; using System.Net; public static class WebClientExtensionMethods { public static byte[] UploadMultipart(this WebClient client, string address, MultipartFormBuilder multipart) { client.Headers.Add(HttpRequestHeader.ContentType, multipart.ContentType); using var stream = multipart.GetStream(); return client?.UploadData(address, stream.ToArray()); } public static byte[] UploadMultipart(this WebClient client, Uri address, MultipartFormBuilder multipart) { client.Headers.Add(HttpRequestHeader.ContentType, multipart.ContentType); using var stream = multipart.GetStream(); return client?.UploadData(address, stream.ToArray()); } public static byte[] UploadMultipart(this WebClient client, string address, string method, MultipartFormBuilder multipart) { client.Headers.Add(HttpRequestHeader.ContentType, multipart.ContentType); using var stream = multipart.GetStream(); return client?.UploadData(address, method, stream.ToArray()); } public static byte[] UploadMultipart(this WebClient client, Uri address, string method, MultipartFormBuilder multipart) { client.Headers.Add(HttpRequestHeader.ContentType, multipart.ContentType); using var stream = multipart.GetStream(); return client?.UploadData(address, method, stream.ToArray()); } public static void UploadMultipartAsync(this WebClient client, Uri address, MultipartFormBuilder multipart) { client.Headers.Add(HttpRequestHeader.ContentType, multipart.ContentType); using var stream = multipart.GetStream(); client?.UploadDataAsync(address, stream.ToArray()); } public static void UploadMultipartAsync(this WebClient client, Uri address, string method, MultipartFormBuilder multipart) { client.Headers.Add(HttpRequestHeader.ContentType, multipart.ContentType); using var stream = multipart.GetStream(); client?.UploadDataAsync(address, method, stream.ToArray()); } public static void UploadMultipartAsync(this WebClient client, Uri address, string method, MultipartFormBuilder multipart, object userToken) { client.Headers.Add(HttpRequestHeader.ContentType, multipart.ContentType); using var stream = multipart.GetStream(); client?.UploadDataAsync(address, method, stream.ToArray(), userToken); } } } Код namespace TelegramSenderEx { using System; using System.Net; public static class WebClientExtensionMethods { public static byte[] UploadMultipart(this WebClient client, string address, MultipartFormBuilder multipart) { client.Headers.Add(HttpRequestHeader.ContentType, multipart.ContentType); using var stream = multipart.GetStream(); return client?.UploadData(address, stream.ToArray()); } public static byte[] UploadMultipart(this WebClient client, Uri address, MultipartFormBuilder multipart) { client.Headers.Add(HttpRequestHeader.ContentType, multipart.ContentType); using var stream = multipart.GetStream(); return client?.UploadData(address, stream.ToArray()); } public static byte[] UploadMultipart(this WebClient client, string address, string method, MultipartFormBuilder multipart) { client.Headers.Add(HttpRequestHeader.ContentType, multipart.ContentType); using var stream = multipart.GetStream(); return client?.UploadData(address, method, stream.ToArray()); } public static byte[] UploadMultipart(this WebClient client, Uri address, string method, MultipartFormBuilder multipart) { client.Headers.Add(HttpRequestHeader.ContentType, multipart.ContentType); using var stream = multipart.GetStream(); return client?.UploadData(address, method, stream.ToArray()); } public static void UploadMultipartAsync(this WebClient client, Uri address, MultipartFormBuilder multipart) { client.Headers.Add(HttpRequestHeader.ContentType, multipart.ContentType); using var stream = multipart.GetStream(); client?.UploadDataAsync(address, stream.ToArray()); } public static void UploadMultipartAsync(this WebClient client, Uri address, string method, MultipartFormBuilder multipart) { client.Headers.Add(HttpRequestHeader.ContentType, multipart.ContentType); using var stream = multipart.GetStream(); client?.UploadDataAsync(address, method, stream.ToArray()); } public static void UploadMultipartAsync(this WebClient client, Uri address, string method, MultipartFormBuilder multipart, object userToken) { client.Headers.Add(HttpRequestHeader.ContentType, multipart.ContentType); using var stream = multipart.GetStream(); client?.UploadDataAsync(address, method, stream.ToArray(), userToken); } } } И теперь самый главный класс с отправкой данных TGLog.cs namespace TelegramSenderEx { using System; using System.IO; using System.Net; using System.Net.Security; using System.Security.Cryptography.X509Certificates; using System.Text; public static class TGLog { private static bool ValidateRemoteCertificate(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors error) => error.Equals(SslPolicyErrors.None); // Разработал: r3xq1 // Справочник: https://tlgrm.ru/docs/bots/api#making-requests /// <summary> /// Метод для отправки архива в телеграм канал /// </summary> /// <param name="token">Токен канала</param> /// <param name="chatID">Чат ID пользователя</param> /// <param name="сaption">Заголовок сообщения</param> /// <param name="pathToFile">Полный путь до файла</param> private static void SendFile(string token, string chatID, string сaption, string pathToFile) { #region Установка протоколов безопасности для успешной отправки файлов // (SecurityProtocolType)(0xc0 | 0x300 | 0xc00) ServicePointManager.ServerCertificateValidationCallback += ValidateRemoteCertificate; ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Ssl3 | (SecurityProtocolType)768 // Tls 11 | (SecurityProtocolType)3072; // Tls 12 #endregion using var client = new WebClient { Proxy = null }; var multipart = new MultipartFormBuilder(); multipart.AddField("caption", сaption); multipart.AddField("chat_id", chatID); multipart.AddFile("document", new FileInfo(pathToFile)); // Добавление файла string UploadUrl = $"https://api.telegram.org/bot{token}/sendDocument?chat_id={chatID}"; // Тут ничего изменять не нужно. var url = new Uri(UploadUrl, UriKind.Absolute); var rawResponse = client.UploadMultipart(url, "POST", multipart); // Отправка файла через POST var response = Encoding.UTF8.GetString(rawResponse); // Для получения ответа... } } } Код namespace TelegramSenderEx { using System; using System.IO; using System.Net; using System.Net.Security; using System.Security.Cryptography.X509Certificates; using System.Text; public static class TGLog { private static bool ValidateRemoteCertificate(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors error) => error.Equals(SslPolicyErrors.None); // Разработал: r3xq1 // Справочник: https://tlgrm.ru/docs/bots/api#making-requests /// <summary> /// Метод для отправки архива в телеграм канал /// </summary> /// <param name="token">Токен канала</param> /// <param name="chatID">Чат ID пользователя</param> /// <param name="сaption">Заголовок сообщения</param> /// <param name="pathToFile">Полный путь до файла</param> private static void SendFile(string token, string chatID, string сaption, string pathToFile) { #region Установка протоколов безопасности для успешной отправки файлов // (SecurityProtocolType)(0xc0 | 0x300 | 0xc00) ServicePointManager.ServerCertificateValidationCallback += ValidateRemoteCertificate; ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Ssl3 | (SecurityProtocolType)768 // Tls 11 | (SecurityProtocolType)3072; // Tls 12 #endregion using var client = new WebClient { Proxy = null }; var multipart = new MultipartFormBuilder(); multipart.AddField("caption", сaption); multipart.AddField("chat_id", chatID); multipart.AddFile("document", new FileInfo(pathToFile)); // Добавление файла string UploadUrl = $"https://api.telegram.org/bot{token}/sendDocument?chat_id={chatID}"; // Тут ничего изменять не нужно. var url = new Uri(UploadUrl, UriKind.Absolute); var rawResponse = client.UploadMultipart(url, "POST", multipart); // Отправка файла через POST var response = Encoding.UTF8.GetString(rawResponse); // Для получения ответа... } } } Дополнительную информацию по отправке данных можете посмотреть тут
ты просто мастер все усложнять, видимо миллион классов и кода для тебя это не говнокод --- Сообщение объединено с предыдущим 4 май 2021 а ты спиздил с гита XD
Возьми да напиши проще, в чём проблема? Это лишь пример, код можно и упростить по желанию. И я мастер всё упрощать
https://gist.github.com/ericvoid/568d733c90857f010fb860cb5e6aba43 Ну да, кто бы сомневался, ты просто спиzдил с гита
Abraxuy, ещё один "умник", в коде ссылка даже есть на эти классы, специально для таких оставил. алло!