Ответ 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/