0

我正在做一个项目,我通过 API 从另一个站点获取图像,并将图像本地保存在我的服务器上。我一直在想,我无法决定是应该创建一个显示图像的加载器,还是直接访问特定的图像?如果我直接访问它们,是否有任何安全问题?在将图像保存在服务器上之前,我会验证内容并检查它是否为有效图像,因此我将始终显示有效图像。

图像加载器会像这样工作。我创建了一个控制器(例如,将其称为“加载”)。然后我可以用图像作为参数调用加载,有点像这样:

http://example.com/load/file_name.jpg

然后我通过负载控制器获取图像并显示它。这样做有什么好处还是可以直接访问图像?

4

3 回答 3

1

所描述的图像加载器有一个明显的缺点,即对于显示的每个图像,必须实例化框架。一个更好的选择是图像助手,它可用于对图像执行任何所需的修改(水印、调整大小、缓存)并输出图像 url,这样图像就可以由网络服务器交付,而无需额外调用框架。

于 2012-10-04T21:16:53.907 回答
1

如果它们是通过 PHP 发送的,它不会使您的图像更好。数据是一样的,如果不需要限制对指定用户组的访问(又名公共访问),那么我会选择直接访问。

于 2012-10-04T21:18:34.313 回答
0

我会给你一个用例,说明为什么有人(在这种情况下是我)会通过 PHP 提供图像:

在我的一个应用程序中,用户可以上传头像图像。这些图像在上传时进行处理,名称更改为哈希值,并存储在文件系统中。散列名称存储在数据库中的一个表中,该表关联照片的散列、用户 ID,并指示这是否是他们选择的个人资料照片。

如果我只在网站上使用单个图像大小,我会只存储图像路径以及它是否是他们的个人资料图像并且已经完成。但是,该站点有多个可以显示图像的位置,并且它们的大小各不相同。根据请求的图像大小,我检查是否生成了接近它的大小。如果有,那么我发送一个 jpeg 标头,用于readfile图像位置并提供图像。如果还没有,那么我获取最初上传的图像,将其调整为我需要的大小,将其存储在文件系统中,然后提供它。

这样,我不会在每次有人上传图片时创建 5 张以上的图片。图像是按需生成的,既分配了 CPU 时间,又减少了文件系统的使用,因为某些图像大小可能永远不会被请求。

因此,基本上,如果这些适用于您,您就不需要通过 PHP/CI 提供服务:

  • 不限制访问
  • 不需要动态调整大小
  • 不将图像存储在 webroot 之外

如果您好奇,对我的一张图片的请求如下所示:

http://domain.com/photos/view/3d643a9cecaf8ae849be7ab094579698/s-128/photo.jpg

分解:

http://domain.com/[controller/view]/[image hash]/[square, rectangular, or original]-[size in px]/photo.jpg

这将提供具有以下路径的图像:

http://domain.com/images/uploads/3d/64/3a9cecaf8ae849be7ab094579698/3d643a9cecaf8ae849be7ab094579698_s_128.jpg

我将图像存储在子目录中,以便发生冲突,从而避免由于每个目录的最大文件数等导致的文件系统限制。我还可以将图像移到 webroot 之外,这样它们就无法在物理上被 Web 访问。通过 PHP 提供服务还有一个额外的好处,那就是不暴露上传目录的位置。

我知道答案是冗长的,但我希望它可以帮助你做出决定。

于 2012-10-04T23:04:59.417 回答