#c# #file #asp.net-core #telegram #telegram-bot
Вопрос:
В Сервисе1 я создаю массив байтов и отправляю его Кафке.
В Сервисе 2 я получаю сообщение от Сервиса1, создаю PDF-файл с использованием этого массива байтов и отправляю его в TelegramBot, который отправляет его пользователю.
Услуга 1
И вот как я отправляю массив байтов Кафке
byte[] file = _pdfBuilder
.AddObject(o =>
{
o.HtmlContent = html;
})
.Convert();
var result = await producer.ProduceAsync(_producerTopic, new Message<Null, string>()
{
Value = Encoding.Unicode.GetString(file)
}, cancelToken.Token);
Услуга 2
Вот как я попытался создать PDF-файл и отправить его в Telegram-боту
using (var fs = new FileStream("FileName.pdf", FileMode.Create))
{
foreach (var bt in bytes)
{
fs.WriteByte(bt);
}
fs.Seek(0, SeekOrigin.Begin);
var document = new InputOnlineFile(fs, "file.pdf");
await _client.SendDocumentAsync(id, document);
}
Или это
await using var memoryStream = new MemoryStream(bytes);
var doc = new InputOnlineFile(memoryStream, "file.pdf");
await _client.SendDocumentAsync(id, doc);
Или
var memoryStream = new MemoryStream(bytes);
var doc = new InputOnlineFile(memoryStream, "file.pdf");
await _client.SendDocumentAsync(id, doc);
Итак, проблема в следующем: в чате с ботом Telegram я получаю пустой PDF-файл.
Так же я создавал файл в контроллере (файл не был пустым).
byte[] file = _pdfBuilder
.AddObject(o =>
{
o.HtmlContent = html;
})
.Convert();
return File(file, "application/pdf");
Комментарии:
1. Когда вы сохраняете PDF-файл локально из массива байтов, является ли он допустимым pdf-файлом(не поврежден)?
2. Попробуйте сохранить данные, подготовленные для отправки, в файл и откройте этот файл с помощью средства просмотра PDF.
3. Вы отправляете pdf-файл пользователю? или чат на канале?
4. Какой размер pdf вы пытаетесь отправить?
5. Кодировка и декодирование Unicode разрывает файл pdf
Ответ №1:
Кодировка и декодирование Unicode разрывает файл pdf.
Если вам нужно отправить файл в виде строки, используйте преобразование Base64
var byteArray = new byte[] {1,2,3,4,5,6,7,8,9};
var encString = System.Convert.ToBase64String(byteArray);
var decBytes = System.Convert.FromBase64String(encString);
//result: byte[9] { 1, 2, 3, 4, 5, 6, 7, 8, 9 }
Комментарии:
1. Я обновил свой вопрос, пожалуйста, взгляните