如何重命名/存储上传到电子商务应用程序的图像?

时间:2012-02-23 09:12:57

标签: design-patterns

我用PHP编写了我的第一个在线商店。现在正在处理“添加产品”表单,我不知道如何存储图像。

我想我应该:

  1. 检查是否是此图片
  2. 将图片大小调整为我店中使用的“标准”尺寸并生成缩略图
  3. 在“images”目录中生成唯一文件名和存储图像
  4. 使用唯一文件名保存图像并在我的图像表中插入行
  5. 我用这样的列创建了表:

    • 编号
    • 位置 - 图片网址 - “/ 0953026326323436324.jpg”例如
    • OriginalFilename - 用户上传文件的原始名称 - 例如“myproduct1.jpg”

    问题:

    1. 有没有更好的方法呢?
    2. 我应该使用Images from Images表作为唯一文件名,还是继续生成唯一名称(使用PHP函数)?
    3. 我应该生成md5哈希并将其存储在Images表中以避免/处理重复项吗?
    4. 编辑2012-03-03: 通过重复我的意思是具有相同内容的文件(但可能是不同的名称)。

      我没有使用任何框架,这将是简单轻便的在线商店。

4 个答案:

答案 0 :(得分:1)

问题:

  1. 有没有更好的方法呢?
  2. 我应该使用Images from Images表中的Id作为唯一文件名,还是继续生成唯一名称(使用PHP函数)?。
  3. 我应该生成md5哈希并将其存储在Images表中以避免/处理重复项吗?
  4. 数目:

    1. 你正在使用正确的方式。
    2. 是的,你应该使用图像表的Id,或者你可以借助id“id_filename”等生成唯一的名称。
    3. 如果您能够为图像生成唯一名称,为什么使用md5哈希方法。

答案 1 :(得分:1)

首先在客户端检查文件。用这样的东西:

function (fileName) {
    var ext = (-1 !== fileName.indexOf('.')) ? fileName.replace(/.*[.]/, '').toLowerCase() : '';
    var allowed = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'tiff'];

    if (!allowed.length) { return true; }

    for (var i = 0; i < allowed.length; i++) {
        if (allowed[i].toLowerCase() == ext) { return true; }
    }

    return false;
}

在服务器端,检查文件类型并使用以下内容调整大小:

Resizing and Extension check

使用此文件名模式:

[产品编号] _ [号码] .EXT

例如:23_1.jpg和23_2.jpg(如果产品有多个图像)

使用上述模式,您不需要存储产品的图像名称。您只需拥有ProductId

即可查看产品图片

答案 2 :(得分:1)

这实际上取决于您的应用程序对这些图像的作用。这些是我通过经验学到的一些东西......

有多少张图片? 如果我们谈论成千上万的图像,请记住,具有该数量文件的文件夹可能无法通过FTP访问。如果需要访问它们,可以对它们进行分类并将它们放在不同的子文件夹中。 分类可以通过许多事情来完成......从大小到奇数/偶数ID号。这一切都取决于你需要将它们分开多少。

他们是私有图片吗?他们应该公开加入吗?如果您只使用ID作为唯一标识符,则很容易猜到并找到其他图像,因为它们很可能是自动增量的。在那些只抛出用户ID,时间戳,随机数,哈希或任何组合的情况下,您可以生成更安全的名称......

哈希这些名字?你没有得到任何额外的安全保障。如果您已经使用了名称的组合,那么哈希只是一件额外的事情。假设您使用[image_id] _ [timestamp]作为名称,如果您将其哈希,则会丢失该信息。你确实在你的数据库中有它,但它在文件名中也很好。如果由于某种原因,您需要删除某些文件,那么如果您能够识别它们会更容易。并且,回到你可能拥有的图像数量...... MD5中可能存在碰撞。意思是2个文件会得到相同的名字..(这很少见,但可能会发生)


由于它是商店,我猜你不需要图像名称的额外安全性,但你可能需要额外的分类。

顺便说一句,根据您的步骤,您无法使用图像的ID作为文件名,因为您在保存图像后将行插入表中。

如果您需要更多详细信息,请发表评论。

答案 3 :(得分:1)

有没有更好的方法呢?

我最近开发了一些非常相似的东西,这个方法很适合我,但这完全取决于你的设计,目标,代码质量等。

我应该使用Images from Images表作为唯一文件名,还是继续生成唯一名称(使用PHP函数)?

我使用id作为文件名,因为它总是唯一的,这也意味着你不必将它保存到数据库中。例如;需要产品#434的图像?这是images / products / 434.jpg。

我应该生成md5哈希并将其存储在Images表中以避免/处理重复项吗? 这是一个很好的功能,但根据图像和重复的数量,我不会这样做。它为您的代码增加了不必要的复杂性,但回报很少(当你处理1mb +图像和30%重复,或者存储非常有限/昂贵时,这当然会改变)

祝你好运!