PHP图像重命名

时间:2011-10-13 16:49:41

标签: php oop

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

最初,在添加/编辑表单中,有18个<input type="file" />元素。一旦选择并上传了n个图像,它们就不会保留其顺序(上传到插槽#1的图像可能最终位于插槽#2中)。此外,图像以产品编号和索引命名;因此,在插槽#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 - &gt; 123_4.jpg)。
  3. 将目标文件重命名为源文件的原始名称(345334534353.jpg - &gt; 123_3.jpg)。
  4. 将两个图像的数据库条目更新为新名称(数据库存储不带扩展名的名称:123_4)。
  5. 我编写的用于处理此问题的代码只有在图像被正确序列化时才能正常工作,123_1.jpg,123_5.jpg和123_6.jpg将无效,因为它缺少索引2-4。

1 个答案:

答案 0 :(得分:0)

在上传表单中使用适当的字段名称? 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。