我的应用程序具有批量上传功能,其中电子表格中的用户提供文件路径,例如Client1 / Creative Files / File1.jpg,这些文件将如何存储在云文件共享中。批量上传过程将从该位置读取文件,如果找到,将复制到blob存储并在数据库中创建一个条目。最初,我在blob存储中拥有所有内容,因此阅读文件非常简单。
CloudBlobContainer container = this.GetCloudBlobContainer();
var blob = container.GetBlockBlobReference(filePath);
由于我无法映射到blob存储帐户的网络驱动器,因此我创建了一个新的存储帐户并创建了一个文件服务,因此我可以映射到Windows上的共享,以便用户直接上传文件从他们的机器。现在,我遇到了从该共享中获取文件的问题,因为它总是说文件不存在。
public CloudFileShare GetCloudFileShare()
{
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(settings.AzureDropBoxConnectionString);
CloudFileClient fileClient = storageAccount.CreateCloudFileClient();
CloudFileShare filehare = fileClient.GetShareReference(settings.AzureDropboxFileShare);
filehare.CreateIfNotExists();
return filehare;
}
public CloudFile GetFileFromCloudShare(string filePath)
{
CloudFileShare fileShare = this.GetCloudFileShare();
var file = fileShare.GetRootDirectoryReference().GetFileReference(filePath);
return file;
}
当我检查file.Exists()时,它返回" False"虽然文件在那里。
filePath是Client1 / Creative Files / File1.jpg。我想如果我只是将File1.jpg上传到没有文件夹的共享,这可能会起作用,但添加子文件夹会产生问题。我们需要组织文件,并且可能有一些基于客户端的嵌套文件夹以及用户如何组织它们,这就是我们要求他们在电子表格中提供路径的原因。我错过了什么?
当我调试应用程序并检查文件StorageUri时,我看到https://storageaccount.file.core.windows.net/sharename/Client%5CCreative%20Files%5CFile1.jpg
在浏览器上复制此网址后,我看不到该文件。就像我说的,使用blob容器,同样的过程只是文件工作但是当我将文件移动到文件共享时,我无法返回文件。
答案 0 :(得分:0)
我尝试同时指定Client1\\Creative Files\\File1.jpg
和Client1/Creative Files/File1.jpg
,在这两种情况下我都将file.Exists()设置为true。你能否再次确认该文件确实存在。
您根本无法获取文件URL并将其粘贴到浏览器中,并希望看到该文件显示在浏览器中。在Blob Storage中,您可以将容器的ACL设置为Blob
或Container
,然后在浏览器的地址窗口中复制blob的URL时,将在那里显示blob。另一方面,文件共享始终为Private
,并且需要授权对文件的访问。您可以做的一件事是在文件上创建Shared Access Signature (SAS)
,然后在浏览器的地址窗口中复制SAS URL,然后您就可以看到该文件了。
var cred = new StorageCredentials(accountName, accountKey);
var account = new CloudStorageAccount(cred, true);
var client = account.CreateCloudFileClient();
var fileShare = client.GetShareReference("temp");
var rootDirectory = fileShare.GetRootDirectoryReference();
var file1 = rootDirectory.GetFileReference("Client1\\Creative Files\\test.png");
Console.WriteLine(file1.Exists());
var file2 = rootDirectory.GetFileReference("Client1/Creative Files/test.png");
Console.WriteLine(file2.Exists());
//Create shared access signature on file with read permission valid for 1 hour.
var sasToken = file2.GetSharedAccessSignature(new SharedAccessFilePolicy()
{
Permissions = SharedAccessFilePermissions.Read,
SharedAccessExpiryTime = DateTime.UtcNow.AddHours(1)
});
var fileSasUrl = string.Format("{0}{1}", file2.Uri.AbsoluteUri, sasToken);
Console.WriteLine(fileSasUrl);