【问题标题】:Image management in azure cloud environment天蓝色云环境中的图像管理
【发布时间】:2015-12-10 04:39:06
【问题描述】:

所以我有一个 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;

现在这可行,但您可以想象该网站非常慢。有没有更好的方法来处理云中的图像

【问题讨论】:

    标签: asp.net azure azure-blob-storage


    【解决方案1】:

    有很多可能的方法。

    我会列出我的一些建议

    1. 针对网络优化您的 jpeg 图片,https://tinyjpg.com/ 等服务在图片大小方面有显着改进
    2. 确保您的存储帐户与您的客户端连接位于相同或最接近的区域
    3. 尽可能多地使用缓存,一个超级提升可能是使用 Redis 缓存 来处理最近上传的图像,或者可能是请求最多的图像。您需要尝试最适合您的应用的方法
    4. 另一种缓存策略可能是使用 azure CDN Integrate a Storage Account with CDN
    5. 访问数据库时使用参数化查询以防止 SQL 注入 (感谢@Daniel Mann)

    额外信息

    正如我在您的代码中看到的那样,您将图像直接发送到后端,这意味着任何试图获取图像的浏览器/客户端都会导致开销,因为实际上您要下载图像两次

    1. 将图像从存储下载到 Web 应用服务器端
    2. 从服务器端下载到浏览器

    网站中的图像通常是公共图像,因此您可以直接将图像下载到浏览器,而无需通过后端传递。您只需将 blob/容器访问权限设置为 public。

    如果您的图像不是公开的并且需要身份验证,您将需要为每个图像文件创建 SAS 链接,以便通过专门为此会话创建的链接访问当前客户端,并且该链接可能会在一段时间后过期-

    Shared Access Signatures, Part 1: Understanding the SAS Model

    Shared Access Signatures, Part 2: Create and Use a SAS with the Blob Service

    【讨论】:

    • 5.访问数据库时使用参数化查询来防止 SQL 注入
    【解决方案2】:

    对于图像,最好的选择是使用 Azure CDN,虽然它会使用相同的存储和 blob 容器,但它可以很好地扩展,因为图像现在来自 blob 的静态 url,并且会有一个并行现在连接图像,所以我很确定 fetch 看起来非常快,因为它与其他内容并行发生,基本上所有静态内容,如图像、JavaScript、css,如果可以保存在不同的域中,浏览器可以进行多个并行每个域的连接数,因此页面加载速度更快。

    将 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多