c# - 使用 FluentFTP 将文件从 FTP 复制到 blob 存储的 Azure 函数

标签 c# ftp azure-functions azure-blob-storage fluentftp

我有一个添加每日文件的 FTP 源,我需要每天使用 Azure 函数中的 FluentFTP 库将文件从 FTP 复制到 blob 存储

我在 Azure 函数中使用 C#,我完成了所有编码部分,但没有从 FTP 下载文件以将其直接复制到 blob 目标。

//#r "FluentFTP"
#r "Newtonsoft.Json"
#r "System.Data"
#r "Microsoft.WindowsAzure.Storage"

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System.Collections.Generic;
using System.Globalization;
using System;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Auth;
using Microsoft.WindowsAzure.Storage.Blob;

using System.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;
using FluentFTP;

public static async Task<IActionResult> Run(HttpRequest req, ILogger log)
{
    string blobConnectionString = "ConnectionString";

    // Gestione BLOB Storage
    CloudStorageAccount storageAccount = CloudStorageAccount.Parse(blobConnectionString);
    CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
    CloudBlobContainer container = blobClient.GetContainerReference("out");

    using (FtpClient conn = new FtpClient()) 
    {
        conn.Host = "ftp server";
        conn.Credentials = new NetworkCredential("username", "pass");

        // get a list of files and directories in the "/OUT" folder
        foreach (FtpListItem item in conn.GetListing("/OUT")) 
        {
            // if this is a file and ends with CSV
            if (
            item.Type == FtpFileSystemObjectType.File
            &&
            item.FullName.ToLower().EndsWith(".csv")
            )
            {

                string yyyy = item.FullName.Substring(10,4);
                string mm   = item.FullName.Substring(14,2);
                string dd   = item.FullName.Substring(16,2);
                var fileName = "out/brt/" + yyyy + "/"+ mm + "/"+ dd + "/" + item.Name;

                CloudBlockBlob blockBlob = container.GetBlockBlobReference(fileName);
                // download the file
                conn.DownloadFile( blockBlob , item.FullName);
            }
        }

        return new OkObjectResult($"Hello");
    }
}

如果我可以使用 blob 容器作为 FluentFTP 函数的目的地,那将是最好的,但这样我得到的错误是我正在使用的这个 blob block 不是目的地

这是我得到的错误

cannot convert from 'Microsoft.WindowsAzure.Storage.Blob.CloudBlockBlob' to 'string'

我不知道是否有另一种方法可以将文件下载到本地,这样我就可以将它上传到 blob 而不是使用此 client.DownloadFile 函数。

最佳答案

如果您想使用 FluentFTP,您可以使用以下两种方法之一获取 blob 上传流:

  1. CloudBlockBlob.OpenWrite()
  2. CloudBlockBlob.OpenWriteAsync()

然后你可以使用 FTPClient.Download 方法,它接受一个 Stream

public bool Download(Stream outStream, string remotePath, IProgress<double> progress = null)

像这样:

[FunctionName("HttpTriggerCSharp")]
    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.");

        var ftpHost = "xxxxx";
        var ftpUserName = "xxxx";
        var ftpPassword = "xxxx";
        var filename = "xxxxx";            
        string blobConnectionString = "xxxxxxxxxxx";

        CloudStorageAccount storageAccount = CloudStorageAccount.Parse(blobConnectionString);
        CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
        CloudBlobContainer container = blobClient.GetContainerReference("xxxxx");


        FtpClient client = new FtpClient(ftpHost, ftpUserName, ftpPassword); // or set Host & Credentials
        client.EncryptionMode = FtpEncryptionMode.Implicit;
        client.SslProtocols = SslProtocols.None;
        client.ValidateCertificate += new FtpSslValidation(OnValidateCertificate);
        client.Connect();

        void OnValidateCertificate(FtpClient control, FtpSslValidationEventArgs e) {
            // add logic to test if certificate is valid here
            e.Accept = true;
        }

        CloudBlockBlob blockBlob = container.GetBlockBlobReference(filename);
        var outStream = blockBlob.OpenWrite();
        client.Download(outStream,filename);
        outStream.Commit(); // I'm not sure if this is needed?

        log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");


        return  (ActionResult)new OkObjectResult($"Action succeeded.");
    }

关于c# - 使用 FluentFTP 将文件从 FTP 复制到 blob 存储的 Azure 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56847967/

相关文章:

objective-c - NSConnection 关闭时不断开与 FTP 的连接

python - Azure Python 无服务器函数中的 strip 签名验证错误

c# - 使用 Visual Studio 2019 在本地调试 Azure Function

c# - MVC4 和路由

c# - asp.net core mvc 表单 viewmodel 在帖子上为空

c# - 连接未关闭。连接的当前状态为打开

json - 如何在Azure函数中引用json文件

c# - C# 属性可以使程序运行速度变慢吗?

php - WordPress数据库小部件侧边栏搜索: how to connect the html form, php搜索引擎和服务器上的数据库

r - 如何使用 R 通过 FTP 将文件上传到服务器?