在Azure上调整JPEG图像的大小/缓存

本文关键字:缓存 图像 Azure 调整 JPEG | 更新日期: 2023-09-27 18:09:49

我有一个用。net 4.5/MVC 4编写的网站,允许用户上传图像等。这些图像可以以各种大小显示在整个网站上。目前,它的工作方式如下:

  • 图片上传并在内存中重新调整大小,最大宽度为640px(网站将显示的最大宽度)。
  • 调整后的图片保存到/assets/photos/source/{id}-{timestamphash}.jpg。
  • 当不同尺寸的图像请求通过时,我通过组合{id}-{hash}来获得文件名,其中{hash}是id,高度,宽度和其他一些我需要获得图像的信息的组合的哈希值。
  • 如果该图像存在于/assets/photos/cache中,我只是返回它,否则我使用源图像在内存中创建它,然后将其保存到缓存目录。

我喜欢这种方法,因为它发生得很快,并且所有操作都在内存中或通过磁盘检索进行。

我想最终将我的网站转移到Azure。考虑到我所有的图像都将存储为blob,在Azure中如何实现这样的工作流?使用这样的调整大小/缓存策略是否仍然有效,或者是否有其他替代方法?当图像从服务器上传到Azure时,你不会产生网络延迟吗?现在,它只是被保存到磁盘上,这显然要快得多。

只是在寻找一些关于如何将这样的工作流迁移到Azure上可工作和可扩展的方向。

在Azure上调整JPEG图像的大小/缓存

考虑到你上面的评论,为什么不创建一个后台任务,在上传时将大小调整为所有可接受的大小,并将每个大小存储到Azure blob存储中。您是正确的,如果您根据请求调整大小,您将遭受一些延迟和延迟,因为您需要下载源图像,调整大小,然后上传到blob存储,然后将用户重定向到您的blob存储url。考虑到blob存储的"廉价性",我认为为额外的存储多花几毛钱会抵消上述场景中潜在的缓慢性。

以下伪代码:

[HttpPost]
public ActionResult FileUpload(HttpPostedBaseFile file){
   if(ValidateFile(file)){
      //fire off a background tasks that resizes and stores each file size to the azure
      //blog storage.  You could use a naming scheme such as id_size.imageTypeExtension
   } 
}

现在,当请求文件时,您仍然可以使用相同的例程,但不是返回文件结果,而是返回重定向结果

public ActionResult GetImage(string hash){
    //do stuff to get image details
    return Redirect("http://yourAzureBlobStorageDomain.com/Assets/Images/Cache/" + imageDetails")
}

这很酷,因为你不需要下载图像到你的web服务器,然后提供它,但简单地将请求直接重定向到blob存储!这将影响图像标记,例如下面的

<img src="@Url.RouteUrl("GetImage", "Images" new {hash = hash})"/>将击中您的web应用程序,强制重定向到blob存储中的实际图像位置。

你是正确的,你不想在Azure web角色上永久存储任何东西,因为web角色可以随时移动,丢失任何本地存储的数据。

这只是一种简单的方法,以最小的更改保持您的代码库的方式。你可以修改这个行为更像你现在在那你可以查询blob存储如果图像存在,如果是这样,重定向,如果它不那么生成、存储和重定向,但我相信你会发现你会有更多的延迟的问题在这一点上给你需要下载源图像,你的东西然后reupload图像之前指导用户的浏览器去哪里找到它。

然而,这将是你决定是否值得花费额外的时间来根据需要调整大小与存储多个大小的每个图像的成本。顺便说一句,当我们从web/worker角色中使用blob存储时,我们没有注意到明显的延迟问题。显然,它比从磁盘中检索要高,但它并没有真正带来我们所能看到的显著增长。