Azure 云环境中的图像管理
Image management in azure cloud environment
所以我有一个 asp.net 网络表单应用程序,它有很多图像要在每个页面中显示。在上传这些图像时,这些图像被存储到数据库中。在迁移到云之前,我曾经检查文件系统是否存在图像,如果存在,我会获取并显示它,否则我会在文件系统中创建图像,然后使用它。现在我想将这个应用程序移动到云端并实现类似的逻辑,唯一的区别是我保存到 azure blob 存储帐户并从那里获取图像而不是文件系统。下面给出的代码用于从 blob 存储上传和获取图像
CloudBlobContainer BlobContainer = Img.GetCloudBlobContainer();
CloudBlockBlob blob = BlobContainer.GetBlockBlobReference(picture_id + "_HighRes.Jpeg");
var blobs = BlobContainer.ListBlobs(picture_id + "_HighRes.Jpeg");
if (blobs.Count()>0)
{
foreach (var i in blobs)
{
Picture_name = i.Uri.ToString();
}
}
else
{
SqlConnection Db_Con = new SqlConnection(ConfigurationManager.ConnectionStrings["DB_connection"].ToString());
DataSet ds_pic = new DataSet();
Db_Con.Open();
SqlDataAdapter sd_pic = new SqlDataAdapter("select PictureBinary FROM Picture where Id=" + pic_id, Db_Con);
sd_pic.Fill(ds_pic);
Db_Con.Close();
byte[] picbin = (byte[])ds_pic.Tables[0].Rows[0][0];
ImageConverter ic = new ImageConverter();
System.Drawing.Image img = (System.Drawing.Image)ic.ConvertFrom(picbin);
//img.Save(HttpContext.Current.Server.MapPath(imagePath + picture_id + ".Jpeg"), System.Drawing.Imaging.ImageFormat.Jpeg);
System.Drawing.Image img4 = null;
// VariousQuality(img, picture_id, 200, "_HighRes.Jpeg");
// Picture_name = imagePath + picture_id + "_HighRes.Jpeg";
BlobContainer = Img.GetCloudBlobContainer();
blob = BlobContainer.GetBlockBlobReference(picture_id + "_HighRes.Jpeg");
blob.UploadFromStream(new MemoryStream(picbin));
blobs = BlobContainer.ListBlobs(picture_id + "_HighRes.Jpeg");
foreach (var i in blobs)
{
Picture_name = i.Uri.ToString();
}
return Picture_name;
现在可以使用了,但是正如您想象的那样,该网站速度非常慢。有没有更好的方法来处理云中的图像
对于图像,最好的选择是使用 Azure CDN,虽然它会使用相同的存储和 blob 容器,但它的扩展性很好,因为图像现在来自静态 url 的 blob,现在图像将有一个并行连接,所以我很确定 fetch 看起来会非常快,因为它与其他内容并行发生,基本上是所有静态内容,如图像,JavaScript,css 如果可以的话be应该放在不同的域中,浏览器可以为每个域建立多个并行连接,因此页面加载速度更快。
为图像使用 Azure CDN - https://azure.microsoft.com/en-us/documentation/articles/cdn-serve-content-from-cdn-in-your-web-application/#serve-static-content-from-an-azure-cdn-endpoint
调整网页提示 - http://www.brijrajsingh.com/2012/07/few-general-rules-with-scripts-css.html
有很多可能的方法。
我会列出我的一些建议
- 为网络优化您的 jpeg 图像,https://tinyjpg.com/ 等服务在图像尺寸方面有显着改进
- 确保您的存储帐户与您的客户端连接位于相同或最接近的区域
- 尽可能多地使用缓存 ,一种超级提升可能是对最近上传的图像使用 Redis 缓存 或者可能请求最多的图像。您需要尝试最适合您的应用程序
- 另一种缓存策略可以是使用 azure CDN 将存储帐户与 CDN 集成
- 访问数据库时使用参数化查询来防止SQL注入
(感谢@Daniel Mann)
额外信息
正如我在您的代码中看到的那样,您将图像直接发送到后端,这意味着任何 browser/client 尝试获取图像都会导致开销,因为基本上您要下载图像两次
- 正在将图像从存储下载到 Web 应用程序服务器端
- 从服务器端下载到浏览器
网站中的图片通常是public图片,所以您可以直接将图片下载到浏览器而无需通过后端。您只需将 blob/container 访问权限设置为 public.
如果您的图像不是 public 并且需要身份验证,您将需要为每个图像文件创建 SAS link,以便通过专门为以下内容创建的 link 访问当前客户端此会话和 link 可能会在一段时间后过期-
Shared Access Signatures, Part 1: Understanding the SAS Model
Shared Access Signatures, Part 2: Create and Use a SAS with the Blob Service
所以我有一个 asp.net 网络表单应用程序,它有很多图像要在每个页面中显示。在上传这些图像时,这些图像被存储到数据库中。在迁移到云之前,我曾经检查文件系统是否存在图像,如果存在,我会获取并显示它,否则我会在文件系统中创建图像,然后使用它。现在我想将这个应用程序移动到云端并实现类似的逻辑,唯一的区别是我保存到 azure blob 存储帐户并从那里获取图像而不是文件系统。下面给出的代码用于从 blob 存储上传和获取图像
CloudBlobContainer BlobContainer = Img.GetCloudBlobContainer();
CloudBlockBlob blob = BlobContainer.GetBlockBlobReference(picture_id + "_HighRes.Jpeg");
var blobs = BlobContainer.ListBlobs(picture_id + "_HighRes.Jpeg");
if (blobs.Count()>0)
{
foreach (var i in blobs)
{
Picture_name = i.Uri.ToString();
}
}
else
{
SqlConnection Db_Con = new SqlConnection(ConfigurationManager.ConnectionStrings["DB_connection"].ToString());
DataSet ds_pic = new DataSet();
Db_Con.Open();
SqlDataAdapter sd_pic = new SqlDataAdapter("select PictureBinary FROM Picture where Id=" + pic_id, Db_Con);
sd_pic.Fill(ds_pic);
Db_Con.Close();
byte[] picbin = (byte[])ds_pic.Tables[0].Rows[0][0];
ImageConverter ic = new ImageConverter();
System.Drawing.Image img = (System.Drawing.Image)ic.ConvertFrom(picbin);
//img.Save(HttpContext.Current.Server.MapPath(imagePath + picture_id + ".Jpeg"), System.Drawing.Imaging.ImageFormat.Jpeg);
System.Drawing.Image img4 = null;
// VariousQuality(img, picture_id, 200, "_HighRes.Jpeg");
// Picture_name = imagePath + picture_id + "_HighRes.Jpeg";
BlobContainer = Img.GetCloudBlobContainer();
blob = BlobContainer.GetBlockBlobReference(picture_id + "_HighRes.Jpeg");
blob.UploadFromStream(new MemoryStream(picbin));
blobs = BlobContainer.ListBlobs(picture_id + "_HighRes.Jpeg");
foreach (var i in blobs)
{
Picture_name = i.Uri.ToString();
}
return Picture_name;
现在可以使用了,但是正如您想象的那样,该网站速度非常慢。有没有更好的方法来处理云中的图像
对于图像,最好的选择是使用 Azure CDN,虽然它会使用相同的存储和 blob 容器,但它的扩展性很好,因为图像现在来自静态 url 的 blob,现在图像将有一个并行连接,所以我很确定 fetch 看起来会非常快,因为它与其他内容并行发生,基本上是所有静态内容,如图像,JavaScript,css 如果可以的话be应该放在不同的域中,浏览器可以为每个域建立多个并行连接,因此页面加载速度更快。
为图像使用 Azure CDN - https://azure.microsoft.com/en-us/documentation/articles/cdn-serve-content-from-cdn-in-your-web-application/#serve-static-content-from-an-azure-cdn-endpoint
调整网页提示 - http://www.brijrajsingh.com/2012/07/few-general-rules-with-scripts-css.html
有很多可能的方法。
我会列出我的一些建议
- 为网络优化您的 jpeg 图像,https://tinyjpg.com/ 等服务在图像尺寸方面有显着改进
- 确保您的存储帐户与您的客户端连接位于相同或最接近的区域
- 尽可能多地使用缓存 ,一种超级提升可能是对最近上传的图像使用 Redis 缓存 或者可能请求最多的图像。您需要尝试最适合您的应用程序
- 另一种缓存策略可以是使用 azure CDN 将存储帐户与 CDN 集成
- 访问数据库时使用参数化查询来防止SQL注入 (感谢@Daniel Mann)
额外信息
正如我在您的代码中看到的那样,您将图像直接发送到后端,这意味着任何 browser/client 尝试获取图像都会导致开销,因为基本上您要下载图像两次
- 正在将图像从存储下载到 Web 应用程序服务器端
- 从服务器端下载到浏览器
网站中的图片通常是public图片,所以您可以直接将图片下载到浏览器而无需通过后端。您只需将 blob/container 访问权限设置为 public.
如果您的图像不是 public 并且需要身份验证,您将需要为每个图像文件创建 SAS link,以便通过专门为以下内容创建的 link 访问当前客户端此会话和 link 可能会在一段时间后过期-