private void RetrieveFileData(HttpContext context, string filePath, string container) { MediaFileModel resultModel = new MediaFileModel(); // only send request to imageprocessor if querystring exists; can exclude other parameters if needed if (context.Request.RawUrl.Contains("?")) { resultModel = MediaHelper.GetMediaFile(filePath, container, context.Request.RawUrl); } else { resultModel = MediaHelper.GetMediaFile(filePath, container); } if (resultModel.RedirectToAzureStorage) { context.Response.Redirect(filePath.Replace($"/{container}", $"{ConfigurationManager.AppSettings["BlobStorage"]}/{container}"), true); } var myTimeSpan = new TimeSpan(7, 0, 0, 0); context.Response.Cache.SetCacheability(HttpCacheability.Public); context.Response.Cache.SetValidUntilExpires(true); context.Response.Cache.SetMaxAge(myTimeSpan); context.Response.Cache.SetLastModified(resultModel.LastModifiedDate); context.Response.Cache.SetETag(resultModel.ETag.Replace("\\\"", "")); context.Response.AddHeader("Content-MD5", resultModel.ContentMd5); context.Response.ContentType = resultModel.ContentType; // replicate properties returned by blob storage context.Response.AddHeader("Server", "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0"); context.Response.AddHeader("x-ms-request-id", Guid.NewGuid().ToString()); context.Response.AddHeader("x-ms-version", "2009-09-19"); context.Response.AddHeader("x-ms-lease-status", "unlocked"); context.Response.AddHeader("x-ms-blob-type", "BlockBlob"); context.Response.OutputStream.Write(resultModel.ImageData, 0, resultModel.ImageData.Length); context.Response.AddHeader("Content-Length", resultModel.ImageData.Length.ToString()); context.Response.Flush(); context.Response.End(); }
/// <summary> /// Retrieve media content directly from blob storage. /// </summary> /// <param name="filePath">Relative file path</param> /// <param name="container">Container to retrieve media file from</param> /// <returns>Media file using the MediaFileModel</returns> public static MediaFileModel GetMediaFile(string filePath, string container) { var myModel = new MediaFileModel(); var storageAccount = Account; // validate the container has been defined if (string.IsNullOrWhiteSpace(container)) throw new ArgumentNullException("Container is missing; this is required."); var blobContainer = storageAccount.CreateCloudBlobClient().GetContainerReference(container); // validate the filepath isn't empty if (string.IsNullOrWhiteSpace(filePath)) throw new ArgumentNullException("File path is missing; this is required."); var mediaFile = blobContainer.GetBlockBlobReference(filePath.ToLower().Replace($"/{container}/", string.Empty)); // validate the file exists; if not, return 404 if (mediaFile == null || !mediaFile.Exists()) { myModel.RedirectToAzureStorage = true; return myModel; } var myStream = new MemoryStream(); mediaFile.DownloadToStream(myStream); myModel.ImageData = myStream.ToArray(); myModel.ContentType = mediaFile.Properties.ContentType; myModel.RedirectToAzureStorage = false; myModel.LastModifiedDate = mediaFile.Properties.LastModified?.DateTime ?? DateTime.Now; myModel.ETag = mediaFile.Properties.ETag; myModel.ContentMd5 = mediaFile.Properties.ContentMD5; return myModel; }
/// <summary> /// Retrieve media file from Azure Storage and additionally call image processor to retrieve the dynamic image based on the raw url. /// </summary> /// <param name="filePath">The relative filepath to the file.</param> /// <param name="container">Container to retrieve media file from.</param> /// <param name="rawUrl">The url to the file including the query string.</param> /// <returns>Media file using the MediaFileModel</returns> public static MediaFileModel GetMediaFile(string filePath, string container, string rawUrl) { var myModel = new MediaFileModel(); myModel = GetMediaFile(filePath, container); // if RedirectToAzureStorage was set, we couldn't retrieve the media file, so doubtful the remote request will work either. if (myModel.RedirectToAzureStorage) return myModel; // call remote.axd to the defined Azure CDN and pass in the blob storage location. var webc = new WebClient(); myModel.ImageData = webc.DownloadData( $"{ConfigurationManager.AppSettings["AzureCDN"]}/remote.axd/{ConfigurationManager.AppSettings["BlobStorageRequest"]}{rawUrl}"); return myModel; }