为移动设备提供图像的最佳方法

Best approach for serving images for mobile

我目前正在开发支持应用程序用户配置文件的后端系统。该系统与 AndroidiOS 应用程序集成。在移动应用程序中,有一个用于显示用户个人资料图像的个人资料页面、用于更改图像的按钮和其他详细信息。

图片必须采用 JPEGPNG 格式,并且最大尺寸限制为 2MB

目前我的后端通过以下方式上传和提供图片:

  1. 当图像作为 multipart/form-data 发送时,在 SQL database 中提取、插入或更新图像的元数据(如果已经存在),并将图像保存在资产目录中。
  2. 当在 HTTP GET 中请求图像时,它会以 Base64 编码形式发回 data-uri;在浏览器中,我可以将其显示为 HTML img 标签 src 属性的一部分。

现在移动应用程序开发人员要求我更改服务(下载)过程,如(2)中所述。具体来说,他们要求用 link 响应服务器中的静态图像,而不是编码的 Uri

现在,我已经阅读了一些关于使用 data-uri 的要点,以及它如何使图像传输更便携(我可以同时支持 JPEGPNG 而无需任何修改在浏览器上支持不同的格式);另一方面,我还阅读了 Base64 编码图像与原始二值图像相比如何变得更大,响应有效载荷如何变得更大,这意味着更多的飞行处理并且在移动网络上可能会变慢。

现在,我不确定哪种方法最合适。移动应用程序仅在单击配置文件时才需要显示图像。他们可以将图像保存为移动文件系统中的应用程序数据,或者每次获取图像并显示它。

如果有人能帮助回答以下问题,那就太好了:

  1. 我应该继续以 data-uri 的形式提供图像,还是更改后端以将 link 提供给静态文件?
  2. 根据我的用例,这两种方法在性能上是否存在差异?
  3. 对于移动应用程序,与 data-uri 相比,对静态文件使用 link 是否更有利(我的意思是更容易在代码中实现和维护)?

我应该继续将图像作为 data-uri 提供,还是更改后端以将 link 提供给静态文件?

我会继续将图像作为 data-uri 提供。这意味着您可能会将数据从数据库中的 blob 中提取出来,然后将其一起发送。这允许在数据库中更新数据,而不必担心在服务器端更新静态图像。

根据我的用例,这两种方法在性能上是否存在差异?

静态图像可能更快,因为正如您所说,base64 图像可以更大。但是,可能也不是。您可能应该将图像限制为最大尺寸,and/or 在他们上传时将其调整为最大尺寸。我不会太担心,我已经编写了几个应用程序,可以在几秒钟内读取数百张 base64 图像,没有明显的延迟。

对于移动应用程序,与 data-uri 相比,对静态文件使用 links 是否更有利(我的意思是更容易在代码中实现和维护)?

使用 data-uri 可能更容易,因为移动应用程序需要将其转换为适用于 ImageView 或任何需要显示它的文件格式。

如果图片仅供用户在其设备上使用,您真的需要让他们上传吗? (如果您希望相同的个人资料图片出现在他们拥有的每台设备上,您会这样做)或者,它是否可以仅存储在本地应用程序数据存储或本地 SQLite 数据库中?