Being new to writing Azure Functions in C#, I have a problem using the WinSCP method
session.GetFiles
trying to put the retrieved files in a Azure BLOB Storage container.
My code works fine when the
toPath
is set to a directory on my PC and the code is running locally, but when I publish to an Azure Function, I don't know how to replace the
toPath
with something that streams the files to my Azure BLOB storage container.
I read some place that the
GetFiles
method supported streaming, but when I try using my container variable, VS Code tells me that the second parameter in the method must be a string.
Can anyone please provide a solution to this challenge?
using System;
using System.IO;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using WinSCP;
using Azure.Storage.Blobs;
namespace myCompany.Function
{
public static class HttpTrigger1
{
[FunctionName("HttpTrigger1")]
public static async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
ILogger log, ExecutionContext context)
{
log.LogInformation("C# HTTP trigger function processed a request.");
// Test 07-01-2023 Begin
var BLOBStorageConnectionString = “MyConnectionString”;
var BLOBStorageContainerName = "returnfiles";
var container = new BlobContainerClient(BLOBStorageConnectionString,BLOBStorageContainerName);
var toPath = "C:/returnfiles/";
// Test 07-01-2023 End
// Setup session options
SessionOptions sessionOptions = new SessionOptions
{
Protocol = Protocol.Sftp,
HostName = "xxx.xxx.xxx.xxx",
UserName = "xxxxxx",
SshHostKeyFingerprint = "ssh-rsa 1024 03:XX:XX>..",
SshPrivateKeyPath = Path.Combine(context.FunctionAppDirectory,"MyPrivateKey.ppk")
};
using (Session session = new Session())
{
session.ExecutablePath = Path.Combine(context.FunctionAppDirectory, "winscp.exe");
// Connect
session.Open(sessionOptions);
// Download files
TransferOptions transferOptions = new TransferOptions();
transferOptions.TransferMode = TransferMode.Binary;
TransferOperationResult transferResult;
transferResult =
session.GetFiles("/Inbound/NORXXXXXXXXX/*_OUT.*", toPath, false, transferOptions);
// Throw on any error
transferResult.Check();
// Print results
foreach (TransferEventArgs transfer in transferResult.Transfers)
{
Console.WriteLine("Download of {0} succeeded", transfer.FileName);
}
}
}
}
}