2016-04-21 52 views
0

我目前通過公共一滴URL來訪問我網站上的圖片:使用代理下載私人Blob圖像?

https://subscription_name.blob.core.windows.net/users/5/drivers_licence.jpg 

我想改變公衆私人斑訪問和aceess網址爲:

http://localhost:3000/users/5/drivers_licence.jpg 

Blob Url是從數據庫中存儲和提取的,所以我可以運行查詢來使用新前綴(localhost one)更新所有記錄,這很簡單。

問題是:我該如何實現代理,以便當我單擊下載鏈接時,它會在帶有新本地主機url的空白頁面中打開文檔?

localhost僅用於測試目的。我最終會用我的域名替換此:

https://website-name.com/users/5/drivers_licence.jpg 

後來編輯我想通了,我下面貼

+0

能否請你解釋一下你爲什麼要更改URL?爲什麼你不能直接從存儲中提供blob? –

+0

安全。該文件可能包含敏感信息,我不希望其他用戶看到圖像(我不希望信息通過blob URL訪問)。另外,我不想公開blob主機,這就是爲什麼我想用我自己的域名替換它的原因。 – Toonsylvania

回答

0

原來這就是我一直在尋找,萬一有人在尋找一個類似的解決方案:

public class BlobController : ApiController { 

    private readonly BlobHelper helper = new BlobHelper(); 

    [Route("api/blob/{container}/{*filename}")] 
    public HttpResponseMessage BlobDownload(string container, string filename) { 
     var httpResponseMessage = new HttpResponseMessage(); 

     // 1) check if parameters are set 

     // 2) try and get the blob 
     var blob = helper.DownloadBlob(container, filename); 

     // 3) check the response to see if blob actually exists 

     // 4) return the file 
     httpResponseMessage.StatusCode = HttpStatusCode.OK; 
     httpResponseMessage.Content = new ByteArrayContent(blob.Stream); 
     // don't forget to set the content type, this is important in order to mimic the described behaviour (IE: display an image in the browser) 
     httpResponseMessage.Content.Headers.ContentType = new MediaTypeHeaderValue(blob.ContentType); 

     return httpResponseMessage; 
    } 
} 
0

的溶液,作爲一個答案你可以嘗試爲您的Blob存儲配置自定義域名端點,檢查細節here

+0

感謝您的回覆,我知道這一點,但這不完全是我需要的。我想我在這裏尋找接受答案的示例(第三個標題 - ** Proxy Download **):http://stackoverflow.com/questions/7027656/friendly-filename-when-public-download-azure-blob – Toonsylvania

+0

@Toonsylvania謝謝,我想我誤解了你,因此答案不是你想要的,我會繼續挖掘和更新我的答案,如果我得到任何解決方案。抱歉給你帶來不便。 – forester123

+0

謝謝,不用道歉,任何幫助都會大受歡迎:) – Toonsylvania

1

如果你擔心安全問題,並希望保持容器的ACL爲私有的(這BTW是做絕對正確的事),你可以做的是對BLOB創建Shared Access Signature (SAS)Read許可和短期到期。爲了進一步保護SAS,您可以在SAS上應用IP ACL。使用IP ACL,即使用戶與其他用戶共享SAS URL,如果IP地址與SAS中配置的IP地址不同,另一用戶將無法訪問該URL。

如果您擔心未公開存儲帳戶端點,則可以按照@ forester123所述將自定義域映射到BLOB存儲端點。

如果您想通過您的網站域提供blob,唯一的解決方案是先從您的Web服務器上的存儲下載blob,然後從那裏提供blob。以您爲例,我假設容器名稱爲users,並且每個用戶都有虛擬文件夾。在這種情況下您需要做的是在您的網站中創建一個名爲users的文件夾,並在那裏下載blob並將它們保存爲本地文件。保存文件後,應通過您的網站URL訪問它們。

但是我不會推薦這種方法,因爲它效率不高。您需要先將存儲區中的blob下載到本地服務器,然後從該服務器上提供服務。此外,每臺服務器都會限制您可以保存多少本地數據,並且如果您不經常清理文件,則可能會用完磁盤空間。

我的建議是查看共享訪問簽名。你可以在這裏閱讀更多關於它的信息:https://azure.microsoft.com/en-in/documentation/articles/storage-dotnet-shared-access-signature-part-1/

+0

感謝您的回覆。我真正想要的是與我在另一個主題上找到的段落(也與您的第3段相關),它被標記爲**代理下載**。請在這裏看看接受的答案:http://stackoverflow.com/questions/7027656/friendly-filename-when-public-download-azure-blob到目前爲止,我已經嘗試將文件下載到我的API中的MemoryStream控制器,那麼我將以Task 的形式返回對象。我可以使用javascript在瀏覽器中返回文件,但不是通過新url在新標籤中保存文件 – Toonsylvania

+0

在新標籤中打開圖像意味着需要第二次請求您的網站,您需要將文件保存在服務器的某個位置,以便瀏覽器可以找到該文件。 –