是否可以使用GUID(或任何其他名稱)名稱保存blob,但是當用戶請求文件URI http://me.blob.core.windows.net/mycontainer/9BB34783-8F06-466D-AC20-37A03E504E3F時,下載的友好名稱例如下降, MyText.txt?公共下載時的友好文件名Azure blob
回答
啓用用戶在Windows Azure中下載文件(blob)可以通過4種方式完成;
直接下載 - 將集裝箱的公共讀訪問或全部公共讀取權限訪問和揭露網址給最終用戶。這種方法的缺點顯然是安全的 - 當URL暴露時,你無法控制訪問。也沒有辦法檢測下載,並在下載之前/之後執行代碼。
API下載 - 用戶必須運行Windows應用程序,Silverlight的等等。此外 - 應用程序必須包含storeaccount名稱和關鍵 - 這可能危及安全。特別是如果你有幾個客戶使用同一個帳戶(當然他們仍然可以有自己的容器)。
代理下載 - 讓用戶訪問您的服務器上的URL - 然後從Azure中檢索文件,並將其發送給用戶。這樣做的好處是您可以完全控制下載,您可以在下載之前/之後執行代碼,而且您不必公開任何Azure URL /帳戶信息。事實上 - 最終用戶甚至不會看到該文件存儲在Azure中。 你也可以用這種方式覆蓋文件名。缺點是所有流量都會通過您的服務器 - 所以您可能會遇到瓶頸。
傳遞下載(Azure共享訪問簽名) - 創建簽名並將此簽名插入用戶重定向到Azure的URL中。簽名使用戶能夠在有限的時間內訪問文件。這很可能是你最好的選擇。它使得自定義代碼可以在下載之前執行,它將確保用戶的最大下載速度,並且還確保了良好的安全級別。
這是一個代碼片段,它將文件傳輸給用戶,並覆蓋文件名。
//Retrieve filenname from DB (based on fileid (Guid))
// *SNIP*
string filename = "some file name.txt";
//IE needs URL encoded filename. Important when there are spaces and other non-ansi chars in filename.
if (HttpContext.Current.Request.UserAgent != null && HttpContext.Current.Request.UserAgent.ToUpper().Contains("MSIE"))
filename = HttpUtility.UrlEncode(filename, System.Text.Encoding.UTF8).Replace("+", " ");
context.Response.Charset = "UTF-8";
//Important to set buffer to false. IIS will download entire blob before passing it on to user if this is not set to false
context.Response.Buffer = false;
context.Response.AddHeader("Content-Disposition", "attachment; filename=\"" + filename + "\"");
context.Response.AddHeader("Content-Length", "100122334"); //Set the length the file
context.Response.ContentType = "application/octet-stream";
context.Response.Flush();
//Use the Azure API to stream the blob to the user instantly.
// *SNIP*
fileBlob.DownloadToStream(context.Response.OutputStream);
更多的看到這個博客帖子:http://blog.degree.no/2012/04/downloading-blobs-from-windows-azure/
首先,你可以使用BLOB URI自己的自定義域名:http://blogs.msdn.com/b/avkashchauhan/archive/2011/03/22/using-custom-domain-name-with-windows-azure-storage-instead-of-windows-stroage-name-blob-core-windows-net.aspx
爲例,爲您的解決方案...
using Microsoft.WindowsAzure;
using Microsoft.WindowsAzure.StorageClient;
StorageCredentialsAccountAndKey credentials = new StorageCredentialsAccountAndKey(ConfigurationManager.AppSettings["WindowsAzureStorageAccountName"], ConfigurationManager.AppSettings["WindowsAzureStorageAccountKey"]);
CloudStorageAccount cloudStorageAccount = new CloudStorageAccount(credentials, true);
CloudBlobContainer blobContainer = blobClient.GetContainerReference("mycontainer");
// e.g. GUID of currently logged in user
string fileName = System.Web.Security.Membership.GetUser().ProviderUserKey.ToString();
CloudBlob blob = blobContainer.GetBlobReference(fileName);
byte[] blobArray = blob.DownloadByteArray();
Response.ContentType = "text/plain";
Response.AddHeader("content-disposition", "attachment; filename=" + "MyText.txt");
Response.BinaryWrite(blobArray);
Response.End();
我看到你在說什麼,但依賴在將文件傳遞到客戶端之前,將文件下載到我的服務器。我需要客戶端能夠從Azure服務器直接下載。 – CeejeeB
您需要基於用戶GUID進行某種URL重寫。也許這可以幫助:http://forums.asp.net/t/1574817.aspx/1 –
2013年11月有現在在Windows Azure Blob存儲的內容處置頭支持。您可以在blob創建時或通過共享訪問簽名來分配標頭。
我修改了我的保存文檔方法,將可選參數作爲友好名稱下載。
public void SaveDocument(Stream documentToSave, string contentType, string containerName, string url, string friendlyName = null)
{
var container = GetContainer(containerName);
container.CreateIfNotExists();
var blob = container.GetBlockBlobReference(url);
blob.Properties.ContentType = contentType;
if (friendlyName != null)
blob.Properties.ContentDisposition = "attachment; filename=" + friendlyName;
blob.UploadFromStream(documentToSave);
}
更多一點: http://blog.simontimms.com/2013/12/02/content-disposition-comes-to-azure/
謝謝你的更新 – CeejeeB
現在可以通過設置內容處置標題上生成共享訪問簽名:
string sasBlobToken = blob.GetSharedAccessSignature(sharedPolicy, new SharedAccessBlobHeaders()
{
ContentDisposition = "attachment; filename=" + friendlyFileName
});
string downloadLink = blob.Uri + sasBlobToken;
天才,正是我一直在尋找的! – Bern
P L U S O N E正是我需要的 –
- 1. Azure blob,控制文件名下載
- 2. 下載MVC3中的Azure Blob文件
- 3. 從Azure Blob存儲下載文件
- 4. 從Azure下載BLOB
- 5. 重命名azure blob文件並下載它
- 6. Azure Ruby SDK創建公共blob
- 7. Azure的Blob存儲下載
- 8. 異常下載Azure Blob
- 9. 在網站下載Azure Blob
- 10. Azure下載blob部分
- 11. Node.js從公共FTP下載文件
- 12. 生成下載文件時的友好等待消息
- 13. 使用wget或curl下載帶共享訪問簽名的Azure Blob
- 14. 分配一個友好的名稱,一個藍色的下載
- 15. 如何下載Azure BLOB存儲的文件格式
- 16. 從Aurelia的Azure Blob下載或查看文件UI
- 17. 使用FileSaver.js從Azure Blob存儲下載損壞的文件
- 18. 更改文件名從Azure下載
- 19. 使用url的Azure下載blob
- 20. 從Azure Blob下載有限的項目
- 21. 友好的URL與文件同名
- 22. 在Azure Blob存儲上爲IE9強制文件下載
- 23. Azure Batch Pool啓動任務從Blob下載資源文件FileShare
- 24. 從瀏覽器按順序從Azure Blob存儲下載文件
- 25. Azure Automation RunBook將文件從Blob下載到VM
- 26. 將圖像文件從URI複製或下載到Azure Blob
- 27. 如何從Azure Blob存儲下載文件到瀏覽器
- 28. box-node-sdk下載共享公共文件
- 29. Azure:有沒有辦法緩存/重用從Azure blob存儲下載的文件?
- 30. 在azure文件共享和blob之間移動文件
謝謝你這個非常詳細的答案。傳遞下載聽起來正是我需要的。一個問題,在你的代碼示例中,你設置了文件的大小,這是否必須完成,因爲我不知道沒有訪問該文件的信息。 – CeejeeB
設置文件大小是沒有必要的。我這樣做是爲了讓用戶(瀏覽器)能夠看到下載進度。如果你沒有設置,下載時瀏覽器會顯示「unknown filesize」等。 –
在選項3-中,首先將文件下載到捲動的本地資源(temp)文件夾,然後將該URL鏈接到最終用戶。這可能嗎?好主意?在選項4中,有一種方法可以將SAS網址從最終用戶隱藏起來,並讓它們保存文件。我在這裏處理的所有文件都是xmls。 – Aravind