Wie kann ich ein Bild von Azure Blob Storage anzeigen und nicht herunterladen?

8

Ok, ich benutze Node.js und Azure Blob Storage, um einige Datei-Uploads zu verarbeiten.

Wenn eine Person ein Bild hochlädt, möchte ich ihnen ein Miniaturbild des Bildes zeigen. Der Upload funktioniert großartig und ich habe ihn in meinem Blob gespeichert.

Ich habe diesen feinen Link verwendet ( Generating Azure Shared Greifen Sie auf Signaturen mit BlobService.getBlobURL () im Azure SDK für Node.js zu, um mir bei der Erstellung dieses Codes zum Erstellen einer temporären URL für den gemeinsamen Zugriff zu helfen.

%Vor%

Dies erstellt eine URL, die gut ist.

In etwa so: Ссылка

Das Problem ist, dass wenn ich die Temp-URL nehme und sie in meinen Browser stecke, wird nur das Bild heruntergeladen, anstatt es zu betrachten (in diesem Fall ist es eine einfache jpg-Datei).

Dies übersetzt sich in meinen Code, den ich nicht in einem Tag sehen kann ...

Der Link ist richtig und lädt die richtige Datei herunter ...

Gibt es etwas, das ich tun muss, um das Bild anzusehen, anstatt es herunterzuladen?

Danke, David

AKTUALISIEREN

Ok, also habe ich diesen Artikel gefunden: Ссылка

Im Grunde hat es mir gesagt, dass ich den Dateityp beim Hochladen nicht eingestellt habe, damit der Browser nicht weiß, was er damit machen soll.

Ich habe Code von hier verwendet: Ссылка

Dies erlaubte mir, es korrekt hochzuladen und es sieht jetzt richtig im Browser aus.

Das Problem, das ich jetzt habe, ist, dass wenn ich die tempUrl in ein img-Tag setze, bekomme ich diesen Fehler:

Ressource konnte nicht geladen werden: Der Server reagierte mit dem Status 403 (Server konnte die Anforderung nicht authentifizieren. Stellen Sie sicher, dass der Wert des Autorisierungsheaders einschließlich der Signatur korrekt gebildet wurde.)

Dies ist genau der gleiche Link, den ich, wenn ich ihn in meinen Browser poste, gut ausführe ... Warum kann ich ihn nicht in einem Bild-Tag anzeigen?

UPDATE 2

Ok, also als ein dummer Test habe ich eine Verzögerung von 7 Sekunden nach dem Laden meiner Seite und wenn das IMG-Tag die Quelle von der Temp-URL bekommt. Dies scheint das Problem zu beheben (die meiste Zeit), aber es ist offensichtlich eine beschissene Lösung, selbst wenn es funktioniert ...

Zumindest bestätigt dies, dass mein Markup zumindest korrekt ist, weil es manchmal funktioniert.

Ich kann nicht für mein Leben herausfinden, warum eine Verzögerung einen Unterschied machen würde ...

Gedanken?

UPDATE 3

Ok, basierend auf einem Kommentar unten habe ich versucht, meine Startzeit auf ungefähr 20 Minuten in der Vergangenheit zu setzen.

%Vor%

Ich habe meine Startvariable das gleiche Format wie azure.date.minutesFromNow. Es sieht so aus: Fr 13. Dezember 2013 14:53:58

Wenn ich das mache, kann ich das Bild nicht einmal aus dem Browser sehen, geschweige denn das IMG-Tag. Bin mir nicht sicher, ob ich da etwas falsch mache ...

UPDATE 4 - ANTWORT

Dank der glorreichen @MikeWo habe ich die Lösung. Der korrekte Code ist unten:

%Vor%

Mike hatte insofern Recht, als es zwischen der Startzeit des Servers und meinem localhost eine Art Trennung zu geben schien, also musste ich die Startzeit in der Vergangenheit einstellen. In Update 3 habe ich das gemacht, aber Mike bemerkte, dass Azure nicht zulässt, dass die Start- und Endzeit mehr als 60 Minuten beträgt ... also in Update 3 habe ich -20 Start und 60 Ende gemacht, was 80 Minuten ist.

Der neue, erfolgreiche Weg, den ich oben habe, macht den totalen Unterschied 50 Minuten und es funktioniert ohne jegliche Verzögerung.

Danke, dass du dir die Zeit genommen hast Mike!

    
David 13.12.2013, 17:42
quelle

1 Antwort

3

Kurze Version: Es gibt ein bisschen Zeitverschiebung, die in verteilten Systemen auftritt, einschließlich in Azure. Erstellen Sie in dem Code, der die SAS erstellt, statt eine Startzeit von Date.now () zu erstellen, die Startzeit auf eine Minute oder zwei in der Vergangenheit. Dann sollten Sie die Verzögerung entfernen können.

Lange Version: Die Uhr auf der Maschine, die die Signatur erstellt und Date.now hinzufügt, könnte ein paar Sekunden schneller sein als die Maschinen im BLOB-Speicher. Wenn die Anfrage an die URL sofort gemacht wird, hat der BLOB-Dienst noch nicht die "Startzeit" des BLOBs getroffen und wirft somit den 403. So, indem die Startzeit einige Sekunden in der Vergangenheit oder sogar der Start von eingestellt wird Der aktuelle Tag, wenn Sie eine massive Uhr Drift abdecken möchten, bauen Sie im Umgang mit der Uhr Drift.

UPDATE: Nach einigem Versuch und Irrtum: Stellen Sie sicher, dass beim Erstellen einer Adhoc-SAS nicht länger als eine Stunde sein darf. Die Startzeit einige Minuten in der Vergangenheit und dann 60 Minuten in der Zukunft einzustellen, war zu groß. Mach es ein wenig in der Vergangenheit und dann nicht mehr eine Stunde von dann für Ablauf.

    
MikeWo 13.12.2013, 19:58
quelle