#c# #azure #.net-core #azure-functions
Вопрос:
Я отправил файл txt через запрос на публикацию, и я хотел бы прочитать его и сохранить в строке, чтобы я мог использовать когнитивные сервисы в строке. Я попытался преобразовать переменную динамических данных в строку, однако, когда я регистрирую ее, она пуста, как и streamreader. Разве у читателя потока не должно быть какого-то текста?
Ниже приведен мой код.
using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Microsoft.WindowsAzure.Storage.Blob;
using Microsoft.WindowsAzure.Storage;
using Microsoft.Azure.ServiceBus;
using System.Text;
namespace Demo1
{
public static class Function1
{
[FunctionName("Function1")]
public static async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
ILogger log)
{
log.LogInformation("C# HTTP trigger function processed a request.");
Person p = new Person();
string fname = req.Query["fname"];
string lname = req.Query["lname"];
string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
log.LogInformation("data to store is" requestBody);
dynamic data = JsonConvert.DeserializeObject(requestBody);
//fname = fname ?? data?.fname;
//lname = lname ?? data?.lname;
string text = Convert.ToString(data);
log.LogInformation("data to store is" text);
if (!string.IsNullOrEmpty(fname))
{
p.firstName = fname;
p.lasttName = lname;
p.text = text;
//string filename = fname ".txt";
Guid g = Guid.NewGuid();
string filename = g ".txt";
await CreateBlob(filename, p, log, filename);
}
string responseMessage = string.IsNullOrEmpty(fname)
? "This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response."
: $"Hello, {fname} {lname}.";
return new OkObjectResult(responseMessage);
}
Комментарии:
1. Глядя на ваш код, кажется, что ваша функция ожидает тело JSON. Это то, что вы передаете в вызове API POST? Можете ли вы отредактировать вопрос с помощью скриншота того, как выглядит ваш вызов API POST (возможно, через почтальона). Также, где находится функция CreateBlob?
Ответ №1:
Для чтения файла в запросе post вы можете использовать Http Request Form
для получения сведений о файле.
Используйте InputStream
для чтения файла. Проверьте приведенный ниже код для справки.
using System;
using System.IO;
using System.Web;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
namespace functionreadfile
{
public static class Function1
{
[FunctionName("Function1")]
public static async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
ILogger log)
{
log.LogInformation("C# HTTP trigger function processed a request.");
var formdata = await req.ReadFormAsync();
var filePath = "D:\";
string name = formdata["name"];
var textfile = req.Form.Files["file"];
if (textfile.Length > 0)
{
using (var inputStream = new FileStream(filePath textfile.FileName, FileMode.Create))
{
// read file to stream
await textfile.CopyToAsync(inputStream);
// stream to byte array
byte[] array = new byte[inputStream.Length];
inputStream.Seek(0, SeekOrigin.Begin);
inputStream.Read(array, 0, array.Length);
// get file name
string fName = textfile.FileName;
}
}
string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
dynamic data = JsonConvert.DeserializeObject(requestBody);
name = name ?? data?.name;
string responseMessage = string.IsNullOrEmpty(name)
? "This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response."
: $"Hello, {name}. This HTTP triggered function executed successfully.";
return new OkObjectResult(responseMessage);
}
}
}
Точно так же вы можете использовать его в своем коде для чтения файла.