上传 *.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);
            }
        }
    }
}

结果:

参考资料: Azure Function that converts CSV Files to JSON

示例 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)-

https://docs.microsoft.com/en-us/answers/questions/130134/upload-imagesfiles-to-blob-azure-via-web-api-aspne.html

https://tutexchange.com/uploading-download-and-delete-files-in-azure-blob-storage-using-asp-net-core-3-1/

如果您想要最简单的解决方案,无需任何编码 -

(1) 使用在线 CSV 到 JSON 转换器

(2)使用Azure Storage Explorer上传转换后的文件(https://azure.microsoft.com/en-in/features/storage-explorer/#overview)

使用起来非常简单。

您可以更进一步,将您的网络应用程序设计为直接读取 csv 文件(几乎所有语言都可以 js/php 等),您根本不需要转换,只需使用存储资源管理器即可将 csv 上传到正确的 blob 容器。