2

我有以下代码试图在我的 azure 文件存储帐户上创建一个空白文件

CloudStorageAccount sa = CloudStorageAccount.Parse(connectionString);
var fc = sa.CreateCloudFileClient();
var share = fc.GetShareReference("uploadparking");
share.CreateIfNotExists();
var rootDirectory = share.GetRootDirectoryReference();
var subDirectory = rootDirectory.GetDirectoryReference("valuationrequests");
subDirectory.CreateIfNotExists();
var uri = new Uri(subDirectory.Uri.ToString() + "/file.txt");
var file = new CloudFile(uri);
file.Create(0);

在最后一行我得到以下异常:

Microsoft.WindowsAzure.Storage.StorageException' occurred in Microsoft.WindowsAzure.Storage.dll

Additional information: The remote server returned an error: (404) Not Found.

我不确定它找不到什么。它不应该在创建文件时尝试查找文件。我已经确认目录存在。

如果有人知道我可以成功创建文件,请告诉我。我检查了教程,遗憾的是它们只显示了如何下载文件而不是上传。

4

1 回答 1

1

我认为文档不正确。文档只提到 URI 应该是绝对的。它没有提到,如果您使用的是绝对 URI,那么您还应该传递存储凭据,或者 URI 应该包括至少Create具有创建文件权限的共享访问签名。

您应该尝试使用 CloudFile 的以下覆盖来创建实例:https ://docs.microsoft.com/en-us/dotnet/api/microsoft.windowsazure.storage.file.cloudfile.-ctor?view=azurestorage-8.1 .3#Microsoft_WindowsAzure_Storage_File_CloudFile__ctor_System_Uri_Microsoft_WindowsAzure_Storage_Auth_StorageCredentials_

所以你的代码是:

CloudStorageAccount sa = CloudStorageAccount.Parse(connectionString);
var fc = sa.CreateCloudFileClient();
var share = fc.GetShareReference("uploadparking");
share.CreateIfNotExists();
var rootDirectory = share.GetRootDirectoryReference();
var subDirectory = rootDirectory.GetDirectoryReference("valuationrequests");
subDirectory.CreateIfNotExists();
var uri = new Uri(subDirectory.Uri.ToString() + "/file.txt");
var file = new CloudFile(uri, sa.Credentials);
file.Create(0);

其他替代方法是在共享上创建Shared Access Signature (SAS)令牌并在创建 CloudFile 实例时使用 SAS URL。因此,在这种情况下,您的代码将是:

CloudStorageAccount sa = CloudStorageAccount.Parse(connectionString);
        var fc = account.CreateCloudFileClient();
        var share = fc.GetShareReference("uploadparking");
        share.CreateIfNotExists();
        var rootDirectory = share.GetRootDirectoryReference();
        var subDirectory = rootDirectory.GetDirectoryReference("valuationrequests");
        subDirectory.CreateIfNotExists();
        SharedAccessFilePolicy policy = new SharedAccessFilePolicy()
        {
            Permissions = SharedAccessFilePermissions.Create,
            SharedAccessExpiryTime = DateTime.UtcNow.AddMinutes(15)
        };
        var sasToken = share.GetSharedAccessSignature(policy);
        var uri = new Uri(subDirectory.Uri.ToString() + "/file1.txt" + sasToken);
        var file = new CloudFile(uri);
        file.Create(0);
于 2017-09-15T18:29:06.230 回答