【问题标题】:Codeigniter: preferred approach to store images data in a databaseCodeigniter:将图像数据存储在数据库中的首选方法
【发布时间】:2011-12-02 22:16:59
【问题描述】:

我需要将图像数据存储在数据库中。我正在将图像上传到服务器,然后,当然,我需要从数据库中检索它们。我知道在数据库中我应该只存储将实际文件留给文件系统的数据,所以我试图考虑哪一个可能是保存这些数据的最佳方式。

最困扰我的是选择命名方案。在数据库中,我将只有一个 filename 列,其中仅存储文件名和扩展名。没有路径,所以我可以在我的应用程序中配置它。那么:我应该使用什么作为文件名?我想保留一个有意义的名称,因此保留照片标题或至少保留其中的一部分会很酷。但要确保唯一性,哪一种可能是最好的方法?

我知道 Codeigniter 有一个字符串助手,但我也阅读了有关使用 php 函数 uniqid 的信息。然后我可以将 id 附加到图片名称。

你有什么建议?

【问题讨论】:

  • 是什么让您的问题特定于 codeigniter?只是问,因为类似的问题已经在网站上得到了很长的回答,所以如果没有什么具体的,你可以找到答案。
  • 好吧,也许 Codeigniter 可以有一些对此有用的库(我提到的字符串助手)

标签: php image codeigniter filenames


【解决方案1】:

您可以随意将整个映像存储在您的数据库中,只要不会有数十万个(或者您只是喜欢为昂贵的 SCSI 驱动器付费 :))。如果您不确定,文件系统也可以。

对于图像的唯一 ID,最好的方法可能是只使用 DB 插入 ID(保证唯一,无线程/冲突/哭泣)。所以这是一个很好的方法,假设你想将图像保存在文件系统中:

create table images (
   image_id int(20) primary key auto_increment, /* assumes mysql */
   file_path varchar(2500) not null, /* the actual file name and full path */
   file_label varchar(255), /** user's memorable name for the file */
   description varchar(2500), /** user provided description of contents */
   media_type varchar(100), /** something like image/jpeg; privided by php in upload */
);

那么您可能希望将 image_id 与某种分类或标签、user_id 等联系起来。

编辑

为 cmets 添加:

如果您愿意,您始终可以使用真实文件名构建链接,即使您将它们作为简单的图像 ID 存储在文件系统中也是如此。你只需要使用search friendly urls 来做这样的事情(其中 1234 是图像 id 和 /images/ 重定向到你的 php 脚本):

mysite.com/images/db/1234/picture_of_a_cat.jpg)

然后您只需将 /images/db/ 重定向到您的 php 脚本。或者,如果您不想尝试重写它们,您可以使用 $PATH_INFO。

例如,如果您有 mysite.com/images/render.php/1234/picture_of_cat.jpg:

<?php
$parts = explode("/",$PATH_INFO);
$image_id = $parts[3];
$image_from_db = null; //fetch the row from your dabatase here!
header("Content-type: ".$image_from_db['media_type']);
echo file_get_contents($image_from_db['file_path']);

祝你好运! ;)

【讨论】:

  • 嗯,好吧,你是对的 id。使用这种方法,当我要在 url 中显示文件名时,我将只有一个随机 id,同时显示照片标题可能会很好
  • 感谢您的帮助 :) 你让我意识到我可以使用 codeigniter 路由实现类似 mysite.com/images/db/1234/picture_of_a_cat.jpg 的目标
【解决方案2】:

好吧,我更喜欢您在图像名称中使用哈希,如果有两个同名图像可能会发生这种情况,并且会产生未来的问题。

另一个提示,永远不要将文件的内容存储在数据库中,成本远高于仅存储该文件的路径。

【讨论】:

    【解决方案3】:

    将图像存储在数据库中并不是一个好主意,而是将图像的链接存储在数据库中。 例如; 创建一个包含以下字段的表

    • image_id //图片的唯一id
    • image_type // 图像类型("png","jpg","gif".....)
    • image_link // 图片所在文件夹的路径
    • 上传日期 // 图片上传日期(用于数据库查询排序)

    你可以添加任何你想要的字段

    【讨论】:

    • 我以为很清楚,但我从来没有想过在数据库中存储文件
    • @Carlo 我的错,对于文件名,我认为你应该用你喜欢的 md5 或 sha1 或 uniqid 来散列
    • 好的,但我想我会失去在 url 中显示照片名称的可能性
    • @Carlo like kato 建议你可以有一个字段来存储照片的可读名称
    • 是的,我知道,但无论如何我不能只在 url 中使用可读名称,因为我最终会使用它来查询数据库并检索所有其他图像数据。
    猜你喜欢
    • 2011-02-16
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 2012-10-17
    • 1970-01-01
    相关资源
    最近更新 更多