4

我想处理一个输入文件并将其输出到某个位置,例如。FTP 或 Azure 存储。我正在尝试将 Azure Function 与 SaasFile 输入/输出一起使用。我收到以下错误:

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 文档中找不到它。

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

4

4 回答 4

3

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

请确保您使用的是 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
}
于 2016-07-15T22:54:13.813 回答
1

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

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
}

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

于 2016-07-15T18:50:26.677 回答
0

好消息.. 外部文件触发器可用于 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 中,

小路

表示要处理的文件的路径。因此,在上述情况下,当在input-cs文件夹中添加/修改文件时,将触发 azure 功能。

联系

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

于 2017-09-13T07:38:48.993 回答
0

为此,您实际上并不需要 http 触发器。这是一个示例,它在 Dropbox 中监视文件夹(输入-cs)中的新文件,并将文件复制到 googledrive 中的文件夹(输出-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
}
于 2016-07-15T20:35:25.687 回答