2016-06-10 15 views
0

Wir haben Tausende von Dateien im Azure-Blobspeicher gespeichert. Diese Dateien können beliebiger Art sein, am häufigsten sind jedoch PDF-Dateien, Bilder und Excel. Mit dem URI des Blobs in einem Anchor-Tag kann ein Benutzer unseres Systems eine Datei direkt von Azure auf den Computer des Benutzers herunterladen. Alles ist gut.Azure Blob Storage - Steuern des Namens, wenn die Ressource heruntergeladen wird

Wir möchten, dass der BLOB-Name der Name der Datei selbst ist. Wenn der Benutzer die Datei herunterlädt, ist der ursprüngliche Dateiname intakt. Allerdings müssen wir unvermeidliche Dateinamen Kollisionen im Container berücksichtigen. Die Verwendung von GUIDs für den BLOB-Namen ist eine praktikable Lösung. Wenn der Benutzer jedoch klickt, um die Datei herunterzuladen, erhält er einen Dateinamen als GUID-BLOB-Namen (im Gegensatz zum ursprünglichen Dateinamen).

Gibt es eine Möglichkeit, eine GUID für den BLOB-Namen zu verwenden, aber wenn der Benutzer auf den Download der Datei klickt, hat die zurückgegebene Datei den ursprünglichen Dateinamen? Mir ist klar, dass wir die Datei auf unseren Server herunterladen können und eine korrekt benannte Datei an den Benutzer streamen können, aber wir versuchen, unseren Webserver für das Herunterladen von Dateien zu entlasten.

Gibt es also eine Konfigurationseinstellung mit einem Blob, die es ermöglichen würde, die Datei mit dem richtigen Dateinamen zurückzugeben? Wir können einen MIME-Typ für ein Blob festlegen, und wir suchten nach einer ähnlichen Einstellung für den Dateinamen.

Antwort

1

Gibt es eine Möglichkeit, eine GUID für den Blob-Namen zu verwenden, aber wenn der Benutzer Klicks, um die Datei herunterzuladen, die zurückgegebene Datei hat den ursprünglichen Dateinamen? Ich weiß, wir können die Datei auf unseren Server herunterladen und eine korrekt benannte Datei an den Benutzer streamen, aber wir versuchen, die Last von unserem Webserver für Dateidownloads zu halten.

Sie können Content-Disposition Eigenschaft des Blobs verwenden, um dies zu erreichen. Sie können den Namen des Blobs als GUID festlegen, jedoch die Eigenschaft content-disposition des Blobs auf attachment; filename="original-file-name" setzen. Wenn Sie möchten, dass die Datei immer heruntergeladen wird, können Sie diese Eigenschaft dauerhaft festlegen. Wenn Sie diesen Namen jedoch nur beim Herunterladen der Datei festlegen möchten, können Sie einen Shared Access Signature auf dem Blob mit der Berechtigung Read erstellen und diesen Header überschreiben. Ich habe darüber in my blog sometime ago geschrieben. Von meinem Blog-Post:

Angenommen, ein Szenario, in dem Sie Ihre Benutzer die Dateien aus Ihre Speicherkonto herunterladen wollen, aber Sie wollten diese Dateien ein Benutzer freundlichen Namen geben. Darüber hinaus möchten Sie, dass Ihre Benutzer aufgefordert werden, zu speichern, anstatt die Datei im Browser selbst anzuzeigen (z. B. eine PDF-Datei, die sich automatisch nur im Browser öffnet). Zu dies zu erreichen, früher müssten Sie zuerst die Datei von Ihre Blob-Speicher auf Ihrem Server holen und dann schreiben Sie die Daten dieser Datei in den Antwort-Stream, indem Sie "Content-Disposition" Header. In der Tat verbrachte ich einen guten Teil der letzten Woche die gleiche Lösung implementieren. Nur wenn ich gewusst hätte, dass diese Funktion im Speicher selbst kommt :).

Jetzt müssen Sie das nicht tun. Was Sie tun könnten, ist eine Content-Disposition-Eigenschaft auf dem Blob anzugeben und diese als "Anhang; filename = yourdesiredfilename "und wenn Ihr Benutzer versucht, über einen Browser auf diese zuzugreifen, wird eine Dateidownloadoption angezeigt.

Nun können Sie fragen, was ist, wenn ich eine Bilddatei habe, die ich auch inline und auch als herunterladbares Element anzeigen möchte. Sehr gültig Anforderung. Nun, die cleveren Jungs im Storage-Team haben schon darüber nachgedacht :). Nicht nur Sie können die Inhaltsdisposition als Blob-Eigenschaft festlegen, sondern Sie können diese Eigenschaft in einer SAS-URL überschreiben (mehr unter in einem Bit).