Azure Function Blob Trigger copy file to File Share(Azure函数Blob触发器将文件复制到文件共享)
本文介绍了Azure函数Blob触发器将文件复制到文件共享的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
查找有关使用Azure函数Blob触发器(V3)时如何将文件从Azure Blob存储复制到文件共享的帮助
我看到了许许多多关于从文件共享复制到Blob的文章和问题,但没有一篇是反向的,并且试图反转我找到的代码示例的效果不是很好
我已经想出了一个解决方案,但它并不理想,因为我认为它首先将文件下载到内存中,然后上载到文件共享:
[FunctionName("MyBlobTrigger")]
public async void Run([BlobTrigger("uploads/{name}", Connection = "UploadStorageAccount")]Stream myBlob, string name, ILogger log, CancellationToken cancellationToken)
{
ShareClient share = new ShareClient(storageConnection, fileShareName);
ShareDirectoryClient directory = share.GetRootDirectoryClient();
ShareFileClient fileShare = directory.GetFileClient(name);
try
{
using (Stream stream = myBlob)
{
fileShare.Create(stream.Length);
await fileShare.UploadRangeAsync(new Azure.HttpRange(0, stream.Length), stream);
}
}
}
所以这是可行的,不过对于以下问题:
- 我认为它是先下载到内存,然后再上传,我更喜欢仅在Azure服务内传输文件,可能会有一些非常大的文件
- 我的blob也更喜欢使用CloudBlockBlob而不是Stream,主要原因是在函数末尾我需要删除文件,如果使用CloudBlockBlob可以很容易做到这一点。问题是我还不知道怎么复印
有什么想法吗?
编辑-根据接受的答案使用的最终代码:
[FunctionName("MyBlobTrigger")]
public async void Run([BlobTrigger("uploads/{name}", Connection = "UploadStorageAccount")]CloudBlockBlob myBlob, string name, ILogger log, CancellationToken cancellationToken)
{
ShareClient share = new ShareClient(storageConnection, fileShareName);
ShareDirectoryClient directory = share.GetRootDirectoryClient();
ShareFileClient fileShare = directory.GetFileClient(name);
try
{
SharedAccessBlobPolicy sasConstraints = new SharedAccessBlobPolicy
{
SharedAccessExpiryTime = DateTime.UtcNow.AddHours(1),
Permissions = SharedAccessBlobPermissions.Read
};
var sasToken = myBlob.GetSharedAccessSignature(sasConstraints);
var blobSasUrl = $"{myBlob.Uri.AbsoluteUri}{sasToken}";
fileShare.Create(myBlob.Properties.Length);
await fileShare.StartCopyAsync(new Uri(blobSasUrl));
推荐答案
若要将Blob的内容复制到文件共享文件,您实际上不需要先下载它。您只需使用Azure Storage的异步服务器端复制功能即可。
实际上,您将至少使用read
权限为Blob创建一个SAS URL,然后将其用作文件复制操作的源URL。
我在下面添加了一些伪代码,以说明如何执行此操作。
[FunctionName("MyBlobTrigger")]
public async void Run([BlobTrigger("uploads/{name}", Connection = "UploadStorageAccount")]CloudBlockBlob myBlob, string name, ILogger log, CancellationToken cancellationToken)
{
//Step 1: Get shared access signature for the blob.
//var sasToken = myBlob.GetSharedAccessSignature();
//Step 2: Get SAS URL for the blob.
//var blobSasUrl = $"{myBlob.Uri.AbsoluteUri}{sasToken}";
ShareClient share = new ShareClient(storageConnection, fileShareName);
ShareDirectoryClient directory = share.GetRootDirectoryClient();
ShareFileClient fileShare = directory.GetFileClient(name);
ShareClient share = new ShareClient(storageConnection, fileShareName);
ShareDirectoryClient directory = share.GetRootDirectoryClient();
ShareFileClient fileShare = directory.GetFileClient(name);
try
{
//Step 3: Create empty file based on blob's content length
//fileShare.Create(myBlob.Properties.Length);
//Step 4: Copy blob's contents to storage file using async file copy.
//await fileShare.StartCopyAsync(new Uri(blobSasUrl));
}
}
这篇关于Azure函数Blob触发器将文件复制到文件共享的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
沃梦达教程
本文标题为:Azure函数Blob触发器将文件复制到文件共享


基础教程推荐
猜你喜欢
- JSON.NET 中基于属性的类型解析 2022-01-01
- 是否可以在 asp classic 和 asp.net 之间共享会话状态 2022-01-01
- 将事件 TextChanged 分配给表单中的所有文本框 2022-01-01
- 如何动态获取文本框中datagridview列的总和 2022-01-01
- 从 VS 2017 .NET Core 项目的发布目录中排除文件 2022-01-01
- 首先创建代码,多对多,关联表中的附加字段 2022-01-01
- 经典 Asp 中的 ResolveUrl/Url.Content 等效项 2022-01-01
- 错误“此流不支持搜索操作"在 C# 中 2022-01-01
- 全局 ASAX - 获取服务器名称 2022-01-01
- 在 VS2010 中的 Post Build 事件中将 bin 文件复制到物 2022-01-01