Подтвердить что ты не робот

Дружественное имя файла при публичной загрузке Azure blob

Можно ли сохранить blob с именем GUID (или что-то еще), но когда пользователь запрашивает URI файлов http://me.blob.core.windows.net/mycontainer/9BB34783-8F06-466D-AC20-37A03E504E3F, загрузка падает с дружественным именем, например MyText.txt?

4b9b3361

Ответ 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();