【问题标题】:PHP Image RenamingPHP 图像重命名
【发布时间】:2011-10-13 16:49:40
【问题描述】:

我正在扩展库存管理系统以保留商品的图像顺序。

最初,在添加/编辑表单上,有 18 个<input type="file" /> 元素。一旦选择并上传了 n 张图像,它们就不会保留它们的顺序(上传到插槽 #1 的图像可能最终会出现在插槽 #2 中)。此外,图像以产品编号和索引命名;所以在 slot #4 中上传的图片将被命名为12345678_4.jpg

我需要强制图像顺序,以及清理现有条目。例如,产品编号为 555 的给定条目有 5 张图片,但名称分别为 555_1.jpg、555_3.jpg、555_4.jpg、555_5.jpg、555_10.jpg。

鉴于以下标准,维护图像顺序的最简单和最可靠的方法是什么:

  • 文件命名标准必须是x_n.jpg 跨越三个文件夹,其中x 是产品编号,n 是照片编号。 (文件夹是兄弟姐妹:photosmed_photosthumbs)。
  • 图像必须存在于上述三个特定尺寸的文件夹中,且名称完全相同(photos/555_2.jpgmed_photos/555_2.jpgthumbs/555_2.jpg)。
  • 图像需要轻松重新排序(用于显示目的)。

我开始为此目的编写类,但在执行过程中遇到了一些导致代码膨胀和异常的问题。

请回答任何想法,无论大小。


@Marc B 用户上传单个(全尺寸)图像,该图像被复制并重新采样为其他 2 种尺寸,并且需要根据它们的尺寸存在于目录中。

“旧”代码有 18 个输入元素,每个元素名为 photo_n,其中 n 是索引 (1-18)。加载页面的编辑版本时,在给定插槽中存在图像而不是文件输入元素时,将显示缩略图,并使用图像名称(x_n 格式,无扩展名)打印隐藏的输入元素。

目前,在编辑表单上的每个现有图像旁边,都有一个向上和向下箭头。这会将索引(和显示顺序)与其上方或下方的图像交换。这样做需要以下步骤:

  1. 将目标槽中的文件(例如 123_4.jpg)重命名为临时值(随机数:345334534353.jpg)。
  2. 将源槽 (123_3.jpg) 中的文件重命名为目标槽 (123_3.jpg -> 123_4.jpg) 中文件的原始名称。
  3. 将目标文件重命名为源文件的原始名称 (345334534353.jpg -> 123_3.jpg)。
  4. 将两个图像的数据库条目更新为其新名称(数据库存储的名称不带扩展名:123_4)。

我编写的处理这个问题的代码只有在图像被正确序列化的情况下才能正常工作,123_1.jpg、123_5.jpg 和 123_6.jpg 将无法工作,因为它缺少索引 2-4。

【问题讨论】:

    标签: php oop


    【解决方案1】:

    在上传表单中使用适当的字段名称? item_555_1medium_555_1thumb_555_1,如果您让用户自己上传每种类型?使用字符串操作或正则表达式将这样的名称分解为单个元素很容易:

    $items = preg_grep('/^item_\d+_\d+$/', array_keys($_FILES));
    foreach($items as $item) {
        $parts = explode('_', $item);
        $item_id = $parts[1];
        $sub_id = $parts[2];
        ...
    }
    

    另一种选择是在字段名称上使用 PHP 的数组表示法,但是 PHP 处理以数组命名的文件字段的方式使得上传处理有点不稳定,因为在使用数组表示法时它如何(愚蠢地)构建 $_FILES。

    【讨论】:

    • 用户上传单个(全尺寸)图像,该图像被复制并重新采样为其他 2 种尺寸,并且需要根据其尺寸存在于目录中。
    猜你喜欢
    • 1970-01-01
    • 2015-03-17
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-24
    • 1970-01-01
    • 2020-04-27
    相关资源
    最近更新 更多