Можно ли сохранить blob с именем GUID (или что-то еще), но когда пользователь запрашивает URI файлов http://me.blob.core.windows.net/mycontainer/9BB34783-8F06-466D-AC20-37A03E504E3F, загрузка падает с дружественным именем, например MyText.txt?
Дружественное имя файла при публичной загрузке Azure blob
Ответ 1
Включение пользователей для загрузки файлов (blobs) в Windows Azure можно выполнить четырьмя способами;
-
Прямая загрузка. Установите доступ к контейнеру для общедоступного доступа для чтения или полного доступа к общедоступному доступу и укажите URL-адрес конечного пользователя. Недостатком этого метода является, очевидно, безопасность - у вас нет возможности контролировать доступ, когда URL-адрес открыт. Также нет способа обнаружения загрузок и выполнения кода до/после загрузки.
-
Загрузка API. Пользователь должен запустить приложение Windows, Silverlight и т.д. Также - приложение должно содержать имя и ключ хранилища, что может поставить под угрозу безопасность. Особенно, если у вас несколько клиентов, использующих одну и ту же учетную запись (у них все равно могут быть свои собственные контейнеры).
-
Загрузка прокси-сервера. Попросите пользователя получить доступ к URL-адресу на вашем сервере, который затем извлекает файл из Azure и отправляет его пользователю. Преимущество этого заключается в том, что у вас есть полный контроль над загрузками, вы можете выполнять код до/после загрузки, и вам не нужно выставлять любые URL-адреса Azure/информацию об учетной записи. Фактически - конечный пользователь даже не увидит, что файл хранится в Azure. Вы также можете переопределить имя файла. Недостатком является то, что весь трафик проходит через ваш сервер - так что вы можете получить узкое место здесь.
-
Проходная загрузка (подпись общего доступа Azure). Создает подпись и вставляет эту подпись в URL-адрес, где пользователь перенаправляется на Azure. Подпись позволяет пользователю получить доступ к файлу в течение ограниченного периода времени. Это, скорее всего, ваш лучший вариант. Он позволяет настраивать пользовательский код перед загрузкой, он обеспечивает максимальную скорость загрузки для ваших пользователей, а также обеспечивает высокий уровень безопасности.
Здесь фрагмент кода, который передает файлы пользователю и переопределяет имя файла.
//Retrieve filenname from DB (based on fileid (Guid))
// *SNIP*
string filename = "some file name.txt";
//IE needs URL encoded filename. Important when there are spaces and other non-ansi chars in filename.
if (HttpContext.Current.Request.UserAgent != null && HttpContext.Current.Request.UserAgent.ToUpper().Contains("MSIE"))
filename = HttpUtility.UrlEncode(filename, System.Text.Encoding.UTF8).Replace("+", " ");
context.Response.Charset = "UTF-8";
//Important to set buffer to false. IIS will download entire blob before passing it on to user if this is not set to false
context.Response.Buffer = false;
context.Response.AddHeader("Content-Disposition", "attachment; filename=\"" + filename + "\"");
context.Response.AddHeader("Content-Length", "100122334"); //Set the length the file
context.Response.ContentType = "application/octet-stream";
context.Response.Flush();
//Use the Azure API to stream the blob to the user instantly.
// *SNIP*
fileBlob.DownloadToStream(context.Response.OutputStream);
Смотрите этот блогпост для более: http://blog.degree.no/2012/04/downloading-blobs-from-windows-azure/
Ответ 2
Теперь это возможно, установив заголовок content-disposition при создании подписи общего доступа:
string sasBlobToken = blob.GetSharedAccessSignature(sharedPolicy, new SharedAccessBlobHeaders()
{
ContentDisposition = "attachment; filename=" + friendlyFileName
});
string downloadLink = blob.Uri + sasBlobToken;
Ответ 3
По состоянию на ноябрь 2013 года теперь поддерживается заголовок содержимого в Windows Azure Blob Storage. Вы можете назначить заголовок либо на создание блоба, либо через подпись общего доступа.
Я изменил свой метод сохранения документа, чтобы взять необязательный параметр, который является дружественным именем для загрузки.
public void SaveDocument(Stream documentToSave, string contentType, string containerName, string url, string friendlyName = null)
{
var container = GetContainer(containerName);
container.CreateIfNotExists();
var blob = container.GetBlockBlobReference(url);
blob.Properties.ContentType = contentType;
if (friendlyName != null)
blob.Properties.ContentDisposition = "attachment; filename=" + friendlyName;
blob.UploadFromStream(documentToSave);
}
Подробнее об этом: http://blog.simontimms.com/2013/12/02/content-disposition-comes-to-azure/
Ответ 4
Ответ - нет. Вам нужно будет установить заголовок содержимого в блобе, и нет возможности установить этот заголовок в хранилище blob.
Ответ 5
Во-первых, вы можете использовать свой собственный домен для URI блога: http://blogs.msdn.com/b/avkashchauhan/archive/2011/03/22/using-custom-domain-name-with-windows-azure-storage-instead-of-windows-stroage-name-blob-core-windows-net.aspx
Пример решения для вас...
using Microsoft.WindowsAzure;
using Microsoft.WindowsAzure.StorageClient;
StorageCredentialsAccountAndKey credentials = new StorageCredentialsAccountAndKey(ConfigurationManager.AppSettings["WindowsAzureStorageAccountName"], ConfigurationManager.AppSettings["WindowsAzureStorageAccountKey"]);
CloudStorageAccount cloudStorageAccount = new CloudStorageAccount(credentials, true);
CloudBlobContainer blobContainer = blobClient.GetContainerReference("mycontainer");
// e.g. GUID of currently logged in user
string fileName = System.Web.Security.Membership.GetUser().ProviderUserKey.ToString();
CloudBlob blob = blobContainer.GetBlobReference(fileName);
byte[] blobArray = blob.DownloadByteArray();
Response.ContentType = "text/plain";
Response.AddHeader("content-disposition", "attachment; filename=" + "MyText.txt");
Response.BinaryWrite(blobArray);
Response.End();