本文介绍了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触发器将文件复制到文件共享的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!