我正在进行一个项目,将blob从一个容器移动到另一个容器,使用C#的azure函数,我尝试了不同的方法将文件从一个容器复制到另一个容器,但是只能移动名称和扩展名,但是当下载或试图访问文件时,内容是0字节。
这是当前实现的代码。
namespace TestInput
{
[StorageAccount ("BlobConnectionString")]
public class TestInput
{
[FunctionName("TestInput")]
public static void Run(
[BlobTrigger("test/{name}")] Stream myBlob,
[Blob("testoutput/{name}", FileAccess.Write)] Stream outputBlob,
string name,
ILogger log)
{
var accountName = Environment.GetEnvironmentVariable("AccountName");
var accountKey = Environment.GetEnvironmentVariable("AccountKey");
var cred = new StorageCredentials(accountName, accountKey);
var account = new CloudStorageAccount(cred, true);
var client = account.CreateCloudBlobClient();
var sourceContainer = client.GetContainerReference("test");
var sourceBlob = sourceContainer.GetBlockBlobReference($"{name}");
var destinationContainer = client.GetContainerReference("testoutput");
var destinationBlob = destinationContainer.GetBlockBlobReference($"{name}");
destinationBlob.UploadFromStream(myBlob);
sourceBlob.Delete(DeleteSnapshotsOption.IncludeSnapshots);
}
}
}
如果你能告诉我如何解决这个问题,或者我错过了什么参数,我将不胜感激。
发布于 2022-03-31 08:34:44
请检查以下代码是否有助于使用Azure函数将blob从一个容器复制到另一个容器:
下面是Blob触发器类型的.NET 6 Azure函数:
using System;
using System.IO;
using System.Threading.Tasks;
using Azure.Storage.Blobs;
using Microsoft.Azure.WebJobs;
using Microsoft.Extensions.Logging;
using Microsoft.WindowsAzure.Storage.Blob;
namespace KrishBlobTriggerAF1205
{
public class Function1
{
[FunctionName("Function1")]
public async Task RunAsync([BlobTrigger("dev/{name}", Connection = "AzureWebJobsStorage")]Stream myBlob, string name, ILogger log,
[Blob("staging/{name}", FileAccess.Write)] Stream outputBlob)
{
var srcconnectionString = Environment.GetEnvironmentVariable("AzureWebJobsStorage");
string sourceContainer = "source";
string targetContainer = "target";
string blobName = "blob-name.txt";
BlobServiceClient serviceClient = new BlobServiceClient(srcconnectionString);
BlobContainerClient sourceContainerClient = serviceClient.GetBlobContainerClient(sourceContainer);
BlobContainerClient targetContainerClient = serviceClient.GetBlobContainerClient(targetContainer);
BlobClient sourceBlobClient = sourceContainerClient.GetBlobClient(blobName);
BlobClient targetBlobClient = targetContainerClient.GetBlobClient(blobName);
log.LogInformation("Sending copy blob request....");
var result = await targetBlobClient.StartCopyFromUriAsync(sourceBlobClient.Uri);
log.LogInformation("Copy blob request sent....");
log.LogInformation("============");
bool isBlobCopiedSuccessfully = false;
do
{
log.LogInformation("Checking copy status....");
var targetBlobProperties = await targetBlobClient.GetPropertiesAsync();
log.LogInformation($"Current copy status = {targetBlobProperties.Value.CopyStatus}");
if (targetBlobProperties.Value.CopyStatus.Equals(CopyStatus.Pending))
{
System.Threading.Thread.Sleep(1000);
}
else
{
isBlobCopiedSuccessfully = targetBlobProperties.Value.CopyStatus.Equals(CopyStatus.Success);
break;
}
} while (true);
if (isBlobCopiedSuccessfully)
{
log.LogInformation("Blob copied successfully. Now deleting source blob...");
await sourceBlobClient.DeleteAsync();
}
}
}
}
https://stackoverflow.com/questions/71314080
复制