对于我的场景,我试图允许用户使用可以上传到容器的javascript将文件拖放到网页,从管理端上传类似于wordpress媒体上传工作的文件。我遇到的问题是我找到了为容器创建SAS URL的代码,
//Set the expiry time and permissions for the container.
//In this case no start time is specified, so the shared access signature becomes valid immediately.
SharedAccessBlobPolicy sasConstraints = new SharedAccessBlobPolicy();
sasConstraints.SharedAccessExpiryTime = DateTime.UtcNow.AddHours(24);
sasConstraints.Permissions = SharedAccessBlobPermissions.Write;
//Generate the shared access signature on the container, setting the constraints directly on the signature.
string sasContainerToken = container.GetSharedAccessSignature(sasConstraints);
//Return the URI string for the container, including the SAS token.
return container.Uri + sasContainerToken;
但我发现的所有示例似乎表明我必须为每个blob生成一个sas url
Microsoft.WindowsAzure.Storage.Blob.CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
//Get a reference to a container to use for the sample code, and create it if it does not exist.
Microsoft.WindowsAzure.Storage.Blob.CloudBlobContainer container = blobClient.GetContainerReference(containerName);
container.CreateIfNotExists();
//Create a new stored access policy and define its constraints.
Microsoft.WindowsAzure.Storage.Blob.SharedAccessBlobPolicy sharedPolicy = new Microsoft.WindowsAzure.Storage.Blob.SharedAccessBlobPolicy()
{
SharedAccessExpiryTime = DateTime.UtcNow.AddMinutes(10),
Permissions = Microsoft.WindowsAzure.Storage.Blob.SharedAccessBlobPermissions.Write
};
//Get the container's existing permissions.
Microsoft.WindowsAzure.Storage.Blob.BlobContainerPermissions permissions = container.GetPermissions();//new Microsoft.WindowsAzure.Storage.Blob.BlobContainerPermissions();
Microsoft.WindowsAzure.Storage.Blob.CloudBlockBlob blob = container.GetBlockBlobReference(fileName);
return blob.Uri.AbsoluteUri + blob.GetSharedAccessSignature(sharedPolicy);
而不是好像我正在上传一个文件。
管理员可以上传任意数量的文件,因此必须通过web api调用为这些文件中的每一个生成一个blob sas,这似乎是非常低效的。我更愿意为容器生成一个SAS,并允许用户上传到该容器一段指定的时间,比如3个小时。另外,我想使用分块上传每个文件。这是可能的还是我必须为每个文件生成一个blob sas url?
答案 0 :(得分:0)
管理员可以上传任意数量的文件,因此必须这样做 通过web api调用为这些文件中的每一个生成一个blob sas 效率很低。我更愿意生成一个SAS 容器并允许用户上传到该容器 指定时间,比如说3个小时。
当然可以。在具有Write
权限的blob容器上创建SAS(用于上载目的)时,可以使用相同的内容在该容器中上载多个blob。您只需根据上载的文件构建blob URI并附加SAS令牌。例如,您在mycontainer
存储帐户中为myaccount
容器创建了SAS令牌并上传了文件myfile.png
,您的SAS网址将为https://myaccount.blob.core.windows.net/mycontainer/myfile.png?SAS-Token
。
我在你的代码中注意到你正在使用SAS令牌返回容器URI。在这种情况下,您只需在容器名称后插入文件名即可获取blob上载URI。
另外,我想使用分块上传每个文件。
这又是可能的。我在一段时间后写了一篇关于这篇文章的博文,你可能会发现它很有用:
http://gauravmantri.com/2013/02/16/uploading-large-files-in-windows-azure-blob-storage-using-shared-access-signature-html-and-javascript/(这是在Azure存储中支持CORS之前编写的,所以请在帖子中忽略我对CORS的评论)。
http://gauravmantri.com/2013/12/01/windows-azure-storage-and-cors-lets-have-some-fun/