2017-04-10 46 views
0

我的应用程序具有批量上传功能,电子表格中的用户提供文件路径,例如Client1/Creative Files/File1.jpg,这些文件将如何存储在云文件中分享。批量上传过程将从该位置读取文件,如果找到,则将复制到blob存储并在数据库中创建一个条目。最初,我拥有blob存储中的所有内容,因此阅读这些文件非常简单。无法从Azure文件共享中读取文件

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(),它回来了“假”,虽然该文件是在那里。

filePath是Client1/Creative Files/File1.jpg。我猜如果我只是上传File1.jpg到共享没有文件夹,这可能应该工作,但添加子文件夹正在创建一个问题。我们需要组织这些文件,并且可能会有几个基于客户端的嵌套文件夹以及用户如何组织它们,这就是为什么我们要求他们在电子表格中提供路径的原因。我错过了什么?

当我调试应用程序,并检查文件StorageUri,我看到https://storageaccount.file.core.windows.net/sharename/Client%5CCreative%20Files%5CFile1.jpg

在浏览器上复制此网址,我没有看到这个文件。就像我说的,在一个blob容器中,这个过程只是在处理文件,但是当我将文件移动到文件共享时,我无法返回文件。

+0

你是如何确保文件存在于共享?你是否使用某种工具来检查文件的存在? –

+0

我已经映射到来自Windows的azure文件共享,并且已经按照电子表格中所示的相同结构(即Client1/Creative Files/File1.jpg)上载了该文件。我还可以通过访问Azure门户 - >存储帐户 - >文件服务 - >共享进行验证。所以,当我使用上面的代码时,该文件存在但不存在。 – bladerunner

+0

还有一件事...因此,在你的代码中,你将'filePath'作为'Client1/Creative Files/File1.jpg'传递。正确? –

回答

0
  1. 我试图同时指定Client1\\Creative Files\\File1.jpg以及Client1/Creative Files/File1.jpg并在这两种情况下我得到file.Exists()为true。你能否再次确认该文件确实存在。

  2. 您根本无法获取文件URL并将其粘贴到浏览器中,并希望看到该文件在浏览器中显示。在Blob存储中,您可以将容器的ACL设置为BlobContainer,然后当您在浏览器的地址窗口中复制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); 
    
+0

对不起,我的愚蠢。我没有检查我的文件路径,在门户网站上,其中一个文件夹显示为“Creative Proofs”,但在我的测试文件中,我将其作为Creative Files。我很抱歉,我只是将Creative Files视为Creative Proofs。一旦我修复了我的文件路径,它肯定会工作。感谢您使用共享访问签名提供备用解决方案,并提高我对代码工作的信心。这恰好是用户方面的错误。 :) – bladerunner