gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 20:49:29 25 4
gpt4 key购买 nike

我有一个添加每日文件的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com