2015-05-26 18 views
17

Tôi đã liệt kê thành công các tệp khả dụng, nhưng tôi cần biết cách tôi có thể chuyển tệp đó xuống trình duyệt để người dùng tải xuống mà không nhất thiết phải lưu tệp đó vào máy chủCách tải tệp xuống trình duyệt từ Azure Blob Storage

Dưới đây là làm thế nào tôi có được danh sách các tập tin

var azureConnectionString = CloudConfigurationManager.GetSetting("AzureBackupStorageConnectString"); 
var containerName = ConfigurationManager.AppSettings["FmAzureBackupStorageContainer"]; 
if (azureConnectionString == null || containerName == null) 
    return null; 

CloudStorageAccount backupStorageAccount = CloudStorageAccount.Parse(azureConnectionString); 
var backupBlobClient = backupStorageAccount.CreateCloudBlobClient(); 
var container = backupBlobClient.GetContainerReference(containerName); 
var blobs = container.ListBlobs(useFlatBlobListing: true); 
var downloads = blobs.Select(blob => blob.Uri.Segments.Last()).ToList(); 

Trả lời

36

Trong khi nội dung blob có thể được truyền qua máy chủ web và đến người dùng cuối thông qua trình duyệt, giải pháp này đặt tải trên máy chủ web, cả cpu và NIC.

Một cách tiếp cận khác là cung cấp cho người dùng cuối nội dung uri để tải xuống blob mong muốn mà họ có thể nhấp vào trong nội dung html. ví dụ. https://myaccount.blob.core.windows.net/mycontainer/myblob.ext.

Vấn đề với điều này là nếu nội dung là riêng tư, vì một uri chẳng hạn như nội dung trên sẽ không hoạt động trừ khi sử dụng các đốm màu công khai. Đối với điều này, bạn có thể tạo một Signature Access Signature (hoặc chính sách lưu trữ trên máy chủ), sau đó kết quả trong một chuỗi truy vấn được băm được nối thêm vào uri. Uri mới này sẽ có hiệu lực trong một khoảng thời gian nhất định (ví dụ 10 phút).

Dưới đây là một ví dụ nhỏ của việc tạo ra một SAS cho một blob:

var sasConstraints = new SharedAccessBlobPolicy(); 
sasConstraints.SharedAccessStartTime = DateTime.UtcNow.AddMinutes(-5); 
sasConstraints.SharedAccessExpiryTime = DateTime.UtcNow.AddMinutes(10); 
sasConstraints.Permissions = SharedAccessBlobPermissions.Read; 

var sasBlobToken = blob.GetSharedAccessSignature(sasConstraints); 

return blob.Uri + sasBlobToken; 

Lưu ý rằng thời gian bắt đầu được thiết lập để trở thành một vài phút trong quá khứ. Điều này là để đối phó với trôi dạt đồng hồ. Đây là full tutorial Tôi đã lấy/sửa đổi mẫu mã này từ.

Bằng cách sử dụng truy cập blob trực tiếp, bạn sẽ bỏ qua hoàn toàn trường hợp vai trò web/máy ảo/web site (giảm tải máy chủ) và để người dùng cuối kéo nội dung blob trực tiếp từ bộ nhớ blob. Bạn vẫn có thể sử dụng ứng dụng web của mình để đối phó với sự cho phép, quyết định nội dung nào cần phân phối, v.v ... Nhưng điều này cho phép bạn liên kết trực tiếp tới tài nguyên blob, thay vì truyền trực tuyến chúng qua máy chủ web của bạn.

+0

Thông tin thêm về mẫu khóa có giá trị tại đây: https://msdn.microsoft.com/en-us/library/dn568102.aspx –

+0

Tôi đã sử dụng cách tiếp cận tương tự khi gặp lỗi khi tải xuống tệp chỉ với URI của nó. Cám ơn David. – Kris

7

Khi người dùng nhấp vào một tập tin máy chủ đáp ứng với điều này

var blob = container.GetBlobReferenceFromServer(option); 

var memStream = new MemoryStream(); 
blob.DownloadToStream(memStream); 

Response.ContentType = blob.Properties.ContentType; 
Response.AddHeader("Content-Disposition", "Attachment;filename=" + option); 
Response.AddHeader("Content-Length", blob.Properties.Length.ToString()); 
Response.BinaryWrite(memStream.ToArray()); 

HUGE nhờ Dhananjay Kumar cho giải pháp này

+2

Vì vậy, bằng cách làm điều này, bạn nhận ra rằng toàn bộ nội dung của blob sẽ định tuyến thông qua máy chủ của bạn, phải không? Nghĩa là, nội dung của blob sẽ chuyển từ lưu trữ blob sang thể hiện vai trò VM/website/web của bạn, sau đó thông qua cho người dùng cuối của bạn, thông qua IIS/OWIN/etc? –

+0

bạn sẽ đề xuất điều gì? Tôi không thể cung cấp cho người dùng cuối của mình quyền truy cập vào toàn bộ bộ nhớ, do đó trình khám phá bộ lưu trữ Azure sẽ không hoạt động. – stackoverfloweth

+3

Tôi đã đăng câu trả lời thay thế. –

Các vấn đề liên quan