上传 *.csv 以供 azure 函数使用
Upload *.csv to be consumed by azure function
我有一个 Azure 静态 Web 应用程序。我想从本地上传每天生成的 *.CSV 文件,将其转换为 *.json 带有 azure 函数的格式(也是每天),存储它,然后根据 http 触发请求将其传递给静态 Web 应用程序。
如何直接从本地上传*.CSV文件以供函数访问? (到函数目录!?) *.json?
存放在哪里
pass it to the static web app on http trigger request
如果您想 post 它到您的网络应用程序 您可以直接将您的 JSON 内容发送到您的网络应用程序,这是一种解决方法,您可以使用 Blob 触发器和 post 使用 HttpWebRequest
将数据传输到您的网络应用程序。以下是对我有用的代码
using System;
using System.Globalization;
using System.IO;
using System.Text;
using Azure.Storage.Blobs;
using CsvHelper;
using Microsoft.Azure.WebJobs;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using System.Linq;
using System.Threading.Tasks;
using System.Net.Http;
using System.Net;
namespace FunctionApp
{
public static class Function1
{
[FunctionName("Function1")]
public static void Run([BlobTrigger("samples-workitems/{name}", Connection = "AzureWebJobsStorage")]Stream myBlob, string name, ILogger log)
{
log.LogInformation($"C# Blob trigger function Processed blob\n Name:{name} \n Size: {myBlob.Length} Bytes");
var json = Convert(myBlob);
PostJSON(json);
}
public static string Convert(Stream blob)
{
var csv = new CsvReader(new StreamReader(blob), CultureInfo.InvariantCulture);
csv.Read();
csv.ReadHeader();
var csvRecords = csv.GetRecords<object>().ToList();
return JsonConvert.SerializeObject(csvRecords);
}
public static async Task PostJSON(string json)
{
var request = (HttpWebRequest)WebRequest.Create("<Your Web App URL>");
var data = Encoding.ASCII.GetBytes(json);
request.Method = "POST";
request.ContentType = "application/json";
request.ContentLength = data.Length;
using (var stream = request.GetRequestStream())
{
stream.Write(data, 0, data.Length);
}
var response = (HttpWebResponse)request.GetResponse();
var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();
}
}
}
结果:
认为这是我的 CSV 文件
在我选择的API
How can I upload the *.CSV file directly from local to be accessible by the function? (to the function directory!?) Where to store the *.json?
在这种情况下,您可以使用 blob 触发器功能,每次将 csv 文件上传到存储帐户时,它都会选择数据转换为 json 文件,然后将其存储到另一个容器中。请参考下面的代码
using System;
using System.Globalization;
using System.IO;
using System.Text;
using Azure.Storage.Blobs;
using CsvHelper;
using Microsoft.Azure.WebJobs;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using System.Linq;
namespace FunctionApp
{
public static class Function1
{
[FunctionName("Function1")]
public static void Run([BlobTrigger("samples-workitems/{name}", Connection = "AzureWebJobsStorage")]Stream myBlob, string name, ILogger log)
{
log.LogInformation($"C# Blob trigger function Processed blob\n Name:{name} \n Size: {myBlob.Length} Bytes");
var json = Convert(myBlob);
var fileName = name.Replace(".csv", "");
CreateJSONBlob(json, fileName);
}
public static string Convert(Stream blob)
{
var csv = new CsvReader(new StreamReader(blob), CultureInfo.InvariantCulture);
csv.Read();
csv.ReadHeader();
var csvRecords = csv.GetRecords<object>().ToList();
return JsonConvert.SerializeObject(csvRecords);
}
public static void CreateJSONBlob(string json, string fileName)
{
var c = new BlobContainerClient(Environment.GetEnvironmentVariable("AzureWebJobsStorage"), "jsoncontainer");
byte[] writeArr = Encoding.UTF8.GetBytes(json);
using (MemoryStream stream = new MemoryStream(writeArr))
{
c.UploadBlob($"{fileName}.json", stream);
}
}
}
}
结果:
示例 C# 代码,我想在您的首选语言中会有类似的东西(您在这里没有提到您的语言)
public IActionResult CsvToJsonFunction(
[HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = "/csv/upload")] HttpRequest request)
{
var csvFile = request.Form.Files[0]; //csvFile is an IFormFile type
//process your csv Files
var json = CsvToJsonConverter(csvFile);
// another method that uploads to blob (see below)
return new OkObjectResult(json);
}
将 IFormFile 转换为 byte[]/stream,请参阅 -
如何将文件发送到您的端点是另一回事,
为了简单起见,您可以使用 Postman 上传文件,请参阅教程(从 20 秒开始)- https://youtu.be/S7bwkys6D0E?t=20
或者您可以创建一个小型 WPF 应用来执行相同的操作。
现在,如果您想将 json 存储在某个地方,您可以使用 blob。除非您正在构建一个完全成熟的应用程序,否则通过 http 触发器上传到 blob 会有点矫枉过正。
在这种情况下,您可以使用 Blob 相关的 nuget 包并遵循一些教程(以下也适用于 Azure Function)-
如果您想要最简单的解决方案,无需任何编码 -
(1) 使用在线 CSV 到 JSON 转换器
(2)使用Azure Storage Explorer上传转换后的文件(https://azure.microsoft.com/en-in/features/storage-explorer/#overview)
使用起来非常简单。
您可以更进一步,将您的网络应用程序设计为直接读取 csv 文件(几乎所有语言都可以 js/php 等),您根本不需要转换,只需使用存储资源管理器即可将 csv 上传到正确的 blob 容器。
我有一个 Azure 静态 Web 应用程序。我想从本地上传每天生成的 *.CSV 文件,将其转换为 *.json 带有 azure 函数的格式(也是每天),存储它,然后根据 http 触发请求将其传递给静态 Web 应用程序。
如何直接从本地上传*.CSV文件以供函数访问? (到函数目录!?) *.json?
存放在哪里pass it to the static web app on http trigger request
如果您想 post 它到您的网络应用程序 您可以直接将您的 JSON 内容发送到您的网络应用程序,这是一种解决方法,您可以使用 Blob 触发器和 post 使用 HttpWebRequest
将数据传输到您的网络应用程序。以下是对我有用的代码
using System;
using System.Globalization;
using System.IO;
using System.Text;
using Azure.Storage.Blobs;
using CsvHelper;
using Microsoft.Azure.WebJobs;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using System.Linq;
using System.Threading.Tasks;
using System.Net.Http;
using System.Net;
namespace FunctionApp
{
public static class Function1
{
[FunctionName("Function1")]
public static void Run([BlobTrigger("samples-workitems/{name}", Connection = "AzureWebJobsStorage")]Stream myBlob, string name, ILogger log)
{
log.LogInformation($"C# Blob trigger function Processed blob\n Name:{name} \n Size: {myBlob.Length} Bytes");
var json = Convert(myBlob);
PostJSON(json);
}
public static string Convert(Stream blob)
{
var csv = new CsvReader(new StreamReader(blob), CultureInfo.InvariantCulture);
csv.Read();
csv.ReadHeader();
var csvRecords = csv.GetRecords<object>().ToList();
return JsonConvert.SerializeObject(csvRecords);
}
public static async Task PostJSON(string json)
{
var request = (HttpWebRequest)WebRequest.Create("<Your Web App URL>");
var data = Encoding.ASCII.GetBytes(json);
request.Method = "POST";
request.ContentType = "application/json";
request.ContentLength = data.Length;
using (var stream = request.GetRequestStream())
{
stream.Write(data, 0, data.Length);
}
var response = (HttpWebResponse)request.GetResponse();
var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();
}
}
}
结果:
认为这是我的 CSV 文件
在我选择的API
How can I upload the *.CSV file directly from local to be accessible by the function? (to the function directory!?) Where to store the *.json?
在这种情况下,您可以使用 blob 触发器功能,每次将 csv 文件上传到存储帐户时,它都会选择数据转换为 json 文件,然后将其存储到另一个容器中。请参考下面的代码
using System;
using System.Globalization;
using System.IO;
using System.Text;
using Azure.Storage.Blobs;
using CsvHelper;
using Microsoft.Azure.WebJobs;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using System.Linq;
namespace FunctionApp
{
public static class Function1
{
[FunctionName("Function1")]
public static void Run([BlobTrigger("samples-workitems/{name}", Connection = "AzureWebJobsStorage")]Stream myBlob, string name, ILogger log)
{
log.LogInformation($"C# Blob trigger function Processed blob\n Name:{name} \n Size: {myBlob.Length} Bytes");
var json = Convert(myBlob);
var fileName = name.Replace(".csv", "");
CreateJSONBlob(json, fileName);
}
public static string Convert(Stream blob)
{
var csv = new CsvReader(new StreamReader(blob), CultureInfo.InvariantCulture);
csv.Read();
csv.ReadHeader();
var csvRecords = csv.GetRecords<object>().ToList();
return JsonConvert.SerializeObject(csvRecords);
}
public static void CreateJSONBlob(string json, string fileName)
{
var c = new BlobContainerClient(Environment.GetEnvironmentVariable("AzureWebJobsStorage"), "jsoncontainer");
byte[] writeArr = Encoding.UTF8.GetBytes(json);
using (MemoryStream stream = new MemoryStream(writeArr))
{
c.UploadBlob($"{fileName}.json", stream);
}
}
}
}
结果:
示例 C# 代码,我想在您的首选语言中会有类似的东西(您在这里没有提到您的语言)
public IActionResult CsvToJsonFunction(
[HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = "/csv/upload")] HttpRequest request)
{
var csvFile = request.Form.Files[0]; //csvFile is an IFormFile type
//process your csv Files
var json = CsvToJsonConverter(csvFile);
// another method that uploads to blob (see below)
return new OkObjectResult(json);
}
将 IFormFile 转换为 byte[]/stream,请参阅 -
如何将文件发送到您的端点是另一回事, 为了简单起见,您可以使用 Postman 上传文件,请参阅教程(从 20 秒开始)- https://youtu.be/S7bwkys6D0E?t=20
或者您可以创建一个小型 WPF 应用来执行相同的操作。
现在,如果您想将 json 存储在某个地方,您可以使用 blob。除非您正在构建一个完全成熟的应用程序,否则通过 http 触发器上传到 blob 会有点矫枉过正。 在这种情况下,您可以使用 Blob 相关的 nuget 包并遵循一些教程(以下也适用于 Azure Function)-
如果您想要最简单的解决方案,无需任何编码 -
(1) 使用在线 CSV 到 JSON 转换器
(2)使用Azure Storage Explorer上传转换后的文件(https://azure.microsoft.com/en-in/features/storage-explorer/#overview)
使用起来非常简单。
您可以更进一步,将您的网络应用程序设计为直接读取 csv 文件(几乎所有语言都可以 js/php 等),您根本不需要转换,只需使用存储资源管理器即可将 csv 上传到正确的 blob 容器。