使用 Azure 函数处理文件

Process a file using Azure Function

我想处理一个输入文件并将其输出到某个位置以供 ex 使用。 FTP 或 Azure 存储。我正在尝试将 Azure Function 与 SaasFile input/output 结合使用。我遇到以下错误:

2016-07-14T00:44:53 Welcome, you are now connected to log-streaming service. 2016-07-14T00:45:00.580 Script for function 'HttpTriggerCSharp1' changed. Reloading. 2016-07-14T00:45:00.580 Compiling function script. 2016-07-14T00:45:00.721 run.csx(24,25): error CS0622: Can only use array initializer expressions to assign to array types. Try using a new expression instead. 2016-07-14T00:45:00.721 Compilation failed.

这是我的函数签名:

public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, string output, TraceWriter log)

绑定:

{
  "bindings": [
    {
      "authLevel": "function",
      "name": "req",
      "type": "httpTrigger",
      "direction": "in"
    },
    {
      "name": "res",
      "type": "http",
      "direction": "out"
    },
    {
      "type": "apiHubFile",
      "name": "output",
      "path": "path/{file}",
      "connection": "ftp_FTP",
      "direction": "out"
    }
  ],
  "disabled": false
}

我想我在 运行 签名中遗漏了一些东西。我在 Azure documentation 上找不到它。

我需要帮助了解如何使用 FTP 和 Azure 存储进行处理。谢谢你的帮助。

假设您输出到特定的文件名,这是您可以执行此操作的一种方法。在此示例中,我绑定到保管箱文件。

using System.Net;

public static HttpResponseMessage Run(HttpRequestMessage req, TraceWriter log, out string output)
{
    output = req.Content.ReadAsStringAsync().GetAwaiter().GetResult();

    return req.CreateResponse(HttpStatusCode.OK);   
}

bindings:
{
  "bindings": [
    {
      "authLevel": "function",
      "name": "req",
      "type": "httpTrigger",
      "direction": "in"
    },
    {
      "type": "http",
      "name": "res",
      "direction": "out"
    },
    {
      "type": "apiHubFile",
      "name": "output",
      "path": "path/b.txt",
      "connection": "dropbox_DROPBOX",
      "direction": "out",
    }
  ],
  "disabled": false
}

为了绑定到不同的文件名,您需要有一个输入或输入触发器并将文件名传递给输出。与所有其他样本相同。

您真的不需要为此使用 http 触发器。 这是一个示例,它监视文件夹 (input-cs) 以查找 dropbox 中的新文件,并将文件复制到 googledrive 中的文件夹 (output-cs):

using System;

public static void Run(string input, out string output, TraceWriter log)
{
    output = input;
}

绑定:

{

 "bindings": [
    {
      "type": "apiHubFileTrigger",
      "name": "input",
      "direction": "in",
      "path": "input-cs/{name}",
      "connection": "dropbox_DROPBOX"
    },
    {
      "type": "apiHubFile",
      "name": "output",
      "direction": "out",
      "path": "output-cs/{name}",
      "connection": "googledrive_GOOGLEDRIVE"
    }
  ],
  "disabled": false
}

如果您必须使用 Http 触发器并且需要根据某些 header 值或其他值在函数本身中创建文件名,请使用此示例:

请确保您使用的是 Functions 0.4 或更高版本(今天发布)

#r "Microsoft.Azure.WebJobs.Extensions.ApiHub"

using System.Net;
using Microsoft.Azure.WebJobs;

public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log, IBinder binder)
{
    //Get request  body  
    string data = await req.Content.ReadAsStringAsync();

    string fileName = "path/" + Guid.NewGuid().ToString() + ".txt";

    var writer = binder.Bind<TextWriter>(new ApiHubFileAttribute("DROPBOX_dropbox", fileName, FileAccess.Write));

    writer.Write(data);
    return req.CreateResponse(HttpStatusCode.OK);  
}

绑定:

{
  "bindings": [
    {
      "authLevel": "function",
      "name": "req",
      "type": "httpTrigger",
      "direction": "in"
    },
    {
      "name": "res",
      "type": "http",
      "direction": "out"
    }
  ],
  "disabled": false
}

好消息.. 外部文件触发器可用于 Azure 函数。

如果要处理外部 FTP 文件夹中的文件,请先创建 FTP 连接,然后再使用它。

因此 function.json 中 FTP 连接的绑定数组如下所示。

{
  "bindings": [
    {
      "type": "apiHubFileTrigger",
      "name": "inputFile",
      "direction": "in",
      "path": "input-cs/{name}",
      "connection": "ftp_FTP"
    },
    {
      "type": "apiHubFile",
      "name": "$return",
      "direction": "out",
      "path": "output-cs/{name}",
      "connection": "ftp_FTP"
    }
  ],
  "disabled": false
}

在上面JSON,

path

表示要处理的文件路径。因此,在上述情况下,当 input-cs 文件夹中的文件为 added/modified 时,将触发 azure 函数。

connection

表示外部文件连接器名称。