2017-04-10 82 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