2016-04-21 12 views
0

Ich greife zur Zeit Bilder auf meiner Website über eine Öffentlichkeit blob url:Privates Blob-Bild mit Proxy herunterladen?

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

Ich möchte von öffentlichen zu privaten den Blob Zugang zu ändern und aceess die URL wie:

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

Die Blob Url wird gespeichert und aus der Datenbank gezogen, so dass ich eine Abfrage ausführen kann, um alle Datensätze mit dem neuen Präfix (localhost one) zu aktualisieren, das ist das einfache Bit.

Die Frage ist: Wie kann ich den Proxy implementieren, so dass, wenn ich den Download-Link klicke, öffnet es das Dokument auf einer leeren Seite mit der neuen localhost-URL?

Der localhost dient nur zu Testzwecken. Ich werde dies schließlich mit meinem Domain-Namen ersetzen:

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

Später bearbeiten ich es herausgefunden, gab ich die Lösung als Antwort unter

+0

Können Sie mir bitte erklären, warum Sie die URL ändern möchten? Warum können Sie den Blob nicht direkt aus dem Speicher bereitstellen? –

+0

Sicherheit.Die Datei enthält möglicherweise vertrauliche Informationen, und ich möchte nicht, dass andere Benutzer das Bild sehen (ich möchte nicht, dass die Informationen über die Blob-URL zugänglich sind). Außerdem möchte ich den Blob-Host nicht offen legen, weshalb ich ihn durch meine eigene Domain ersetzen möchte. – Toonsylvania

Antwort

0

So ist es das, was ich suchte, sonst falls jemand für eine ähnliche Lösung suchen:

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

Sie können versuchen, einen benutzerdefinierten Domain-Namen für Ihre Blob Speicher konfigurieren Endpunkt, überprüfen Details here

+0

Danke für die Antwort, ich bin mir dessen bewusst, aber es ist nicht genau das, was ich brauche. Ich denke, ich suche hier ein Beispiel für die akzeptierte Antwort (dritte Überschrift - ** Proxy Download **): http://stackoverflow.com/questions/7027656/friendly-filename-when-public-download-azure-blob – Toonsylvania

+0

@Toonsylvania danke, ich glaube ich habe dich missverstanden und somit ist die Antwort nicht das, was du willst, ich werde weiter graben und meine Antwort aktualisieren, wenn ich irgendeine Lösung bekomme. Entschuldigen Sie die Unannehmlichkeiten. – forester123

+0

Danke, keine Notwendigkeit, sich zu entschuldigen, jede Hilfe wird sehr willkommen sein :) – Toonsylvania

1

Wenn Sie um die Sicherheit besorgt sind und wollen die Container ACL als privat halten (was übrigens absolut richtig was zu tun ist), ist das, was Sie tun können, eine Shared Access Signature (SAS) auf dem Blob mit Read Erlaubnis erstellen und kurzer Ablauf. Um die SAS weiter zu sichern, können Sie die IP-ACL auf SAS anwenden. Mit IP-ACL kann der andere Benutzer nicht auf die URL zugreifen, wenn die Benutzer-URL die SAS-URL für einen anderen Benutzer freigibt, wenn die IP-Adresse von der in SAS konfigurierten IP-Adresse abweicht.

Wenn Sie Bedenken haben, den Speicherkontoendpunkt nicht verfügbar zu machen, können Sie Ihrem Blobspeicherendpunkt eine benutzerdefinierte Domäne zuordnen, wie von @ fisherster123 erwähnt.

Wenn Sie die Blobs über Ihre Websitedomain bereitstellen möchten, ist die einzige Lösung, den Blob zuerst aus dem Speicher auf Ihrem Webserver herunterzuladen und dann den Blob von dort aus zu bedienen. Nehmen wir Ihr Beispiel, nehme ich an, dass der Containername users ist und Sie virtuelle Ordner für jeden Benutzer haben. In diesem Fall müssen Sie in Ihrer Website einen Ordner namens users erstellen und die Blobs dort herunterladen und als lokale Dateien speichern. Sobald die Dateien gespeichert sind, sollten sie über Ihre Website-URL zugänglich sein.

Allerdings würde ich diesen Ansatz nicht empfehlen, weil es nicht effizient ist. Sie müssten zuerst den Blob aus dem Speicher auf Ihren lokalen Server herunterladen und von dort aus bereitstellen. Darüber hinaus gibt es für jeden Server eine Begrenzung, wie viele lokale Daten Sie speichern können. Wenn Sie die Dateien nicht ständig bereinigen, ist möglicherweise nicht mehr genügend Speicherplatz vorhanden.

Meine Empfehlung wäre Shared Access Signature zu sehen. Sie können mehr darüber hier lesen: https://azure.microsoft.com/en-in/documentation/articles/storage-dotnet-shared-access-signature-part-1/.

+0

Danke für die Antwort. Was ich wirklich suche ist mit einem Absatz zu tun, den ich zu einem anderen Thema gefunden habe (auch im Zusammenhang mit dem dritten Absatz hier), er wurde mit ** Proxy Download ** gekennzeichnet. Bitte werfen Sie einen Blick auf die akzeptierte Antwort hier: http://stackoverflow.com/questions/7027656/friendly-filename-when-public-download-azure-blob Bisher habe ich versucht, die Datei auf einen MemoryStream in meiner API herunterzuladen Controller, dann gebe ich das Objekt als Task zurück. Ich kann Javascript einfach verwenden, um die Datei im Browser zurück zu geben, aber anstatt die Datei zu speichern, möchte ich sie in einem neuen Tab über die neue URL – Toonsylvania

+0

öffnen Das Öffnen des Bildes in der neuen Registerkarte würde bedeuten, eine zweite Anfrage an Ihre Website und für dass Sie die Datei irgendwo auf Ihrem Server speichern müssen, damit der Browser die Datei finden kann. –