Отправка .json файла из API .NETCore клиенту
Новичок в web API, пишу сервис, который принимает от клиента файл .xlsx методом POST, переводит содержимое в .json и возвращает его обратно клиенту. Принимаю .xlsx через [HttpPost] public async Task<IActionResult> Upload(IList<IFormFile> files), сохраняю, превращаю в .json, во время преобразования сохраняю .json на диске. Каким образом загрузить .json и отправить его через return Ok(json)? Не могу нормально его считать и отправить, максимум нагуглил считывание через JToken jsonFile = JToken.Parse(System.IO.File.ReadAllText(filePath)), но при получении json'a клиентом сохраняется только структура json'a, но содержимое(имя параметров и их значения) не передается(как я понимаю и не считывается в API). Создавать класс для этого бесполезно, ибо Экселевский файл может иметь разнородные данные. Подскажите каким образом его отправить адекватно? Или, может, можно отправить .json без сохранения на диске? Не получилось это сделать, выводит ошибки, может быть, не там/не то пытался ретернить.
В .json преобразую подобным образом, но значения параметров(названия столбцов) для json будут инициализироваться динамически, то есть, алгоритм преобразования в данный момент редактирую, общий вид таков:
using (var inFile = System.IO.File.Open(filepath2, FileMode.Open, FileAccess.Read))
using (var outFile = System.IO.File.CreateText(filePath2))
{
using (var reader = ExcelReaderFactory.CreateReader(inFile, new ExcelReaderConfiguration()
{ FallbackEncoding = Encoding.GetEncoding(1252) }))
using (var writer = new JsonTextWriter(outFile))
{
writer.Formatting = Formatting.Indented;
writer.WriteStartArray();
reader.Read();
int num = 0;
do
{
while (reader.Read())
{
writer.WriteStartObject();
writer.WritePropertyName("Name");
writer.WriteValue(reader.GetString(0));
writer.WritePropertyName("Surname");
writer.WriteValue(reader.GetString(1));
writer.WritePropertyName("Bday");
writer.WriteValue(reader.GetString(2));
...
writer.WriteEndObject();
}
} while (reader.NextResult());
writer.WriteEndArray();
}
}
P.S. тапками прошу не кидаться, буду рад любым советам :)
Ответы (1 шт):
Пример для GET, для простоты проверки. Из этого легко сделать POST. Не понял что за кодирвока 1252(возможно 1251) но вообще сответую использовать UTF8. Пример прост, не требует временного хранения на диске. Может вернуть как файл, так и просто текст. Думаю это то чновам было нужно.
[HttpGet]
public IActionResult Get()
{
var memoryStream = new MemoryStream();
using (var streamWriter = new StreamWriter(memoryStream, Encoding.UTF8, 1024, true))
using (var writer = new JsonTextWriter(streamWriter))
{
writer.Formatting = Formatting.Indented;
writer.WriteStartArray();
writer.WriteStartObject();
writer.WritePropertyName("Name");
writer.WriteValue("Ivan");
writer.WritePropertyName("Surname");
writer.WriteValue("Ivanov");
writer.WriteEndObject();
writer.WriteEndArray();
}
memoryStream.Seek(0, SeekOrigin.Begin);
//Если нужно вернуть файл
// return File(memoryStream, MediaTypeNames.Text.Plain, $"json.txt");
//Если нужно вернуть текстом
using (var streamReader = new StreamReader(memoryStream, Encoding.UTF8))
{
return Ok(streamReader.ReadToEnd());
}
}