感谢您花时间阅读本文。我有一个有35个文件输入框的表单,作为CMS的一部分,我的客户可以上传他的每个产品的35张图片。分解为黑色7张,蓝色7张,灰色7张,红色7张,白色7张。所以他总共需要上传35张照片。此外,对于他上传的每个文件,需要制作一个较小的"缩略图"大小的图片。我有一个文件上传脚本,我经常使用它,当有一个文件要上传时,它的效果很好。我不确定如何在这个35个文件的情况下应用它。每个输入框都有一个唯一的名称(black1, black2…黑7,蓝1,蓝2……因此,从技术上讲,我可以使用每个文件输入框的唯一名称重复上传代码35次,但这显然是非常低效的。我希望这里有人能帮我想出更好的解决办法。
另一个要求是文件的名称存储在数据库中。所有黑色图片的文件名用字符串表示,以逗号分隔,存储在数据库的blackpics
列中。将所有蓝色图片的文件名放入字符串中,以逗号分隔,并存储在数据库的bluepics
列中。对于灰色、红色和白色的图片也是如此。
这是我现在上传一个文件的代码。它从输入框"file"中获取文件,检查它是否具有正确的扩展名(图像文件),检查文件大小,创建一个带有随机数和时间戳的随机文件名,创建一个缩略图(448px x 298px -大缩略图,我知道),检查上传的原始图像是否具有正确的尺寸(873px x 581px),如果一切正常,我最终将大文件保存在…/images/store/大/和拇指保存在../images/store/小/。它们都有相同的文件名,只是存储在不同的目录中。临时文件被删除,如果有任何错误,文件被删除。正如我所说,这对于一个文件非常有效。
所以我需要做的是修改代码,让它为输入框"black1" "black2"…"black7",然后将所有文件名保存为字符串(black1.jpg,black2.jpg,black3.jpg,black4.jpg,black5.jpg,black6.jpg,black7.jpg),然后我可以将其存储在数据库的"blackpics"列中。蓝色、灰色、红色和白色也一样。我不需要任何数据库部分的帮助。我在想,我需要创建一个包含返回文件名的文件上传脚本的函数。然后调用该函数35次,每个输入框调用一次。但我可能错了。
如果有人能给我提供任何帮助,我将不胜感激。下面是上传脚本的代码:<?php
$filename = $_FILES["file"]["name"];
$file_basename = substr($filename, 0, strripos($filename, '.')); // get file extention
$file_ext = substr($filename, strripos($filename, '.')); // get file name
$filesize = $_FILES["file"]["size"];
$allowed_file_types = array('.jpg','.gif','.png', '.JPG');
if (in_array($file_ext,$allowed_file_types) && ($filesize < 1024000)) {
// rename file
$rand = rand(1,100000000);
$time = time();
$newfilename = $rand . $time . $file_ext;
if (file_exists("../images/store/big/" . $newfilename)) {
// file already exists error
$err[] = "You have already uploaded this file.";
} else {
move_uploaded_file($_FILES["file"]["tmp_name"], "../images/store/big/" . $newfilename);
$pathToImage = '../images/store/big/' . $newfilename;
$pathToThumb = '../images/store/small/' . $newfilename;
$last4 = substr($pathToImage, -4);
switch(strtolower($last4)) {
case '.jpeg':
$img = imagecreatefromjpeg($pathToImage);
break;
case '.jpg':
$img = imagecreatefromjpeg($pathToImage);
break;
case '.png':
$img = imagecreatefrompng($pathToImage);
break;
case '.gif':
$img = imagecreatefromgif($pathToImage);
break;
default:
exit('Unsupported type: '. $pathToImage);
}
$max_width = 448;
$max_height = 298;
// Get current dimensions
$old_width = imagesx($img);
$old_height = imagesy($img);
// Calculate the scaling we need to do to fit the image inside our frame
$scale = min($max_width/$old_width, $max_height/$old_height);
// Get the new dimensions
$new_width = ceil($scale*$old_width);
$new_height = ceil($scale*$old_height);
$tmp_img = imagecreatetruecolor($new_width, $new_height);
imagecopyresampled($tmp_img, $img, 0, 0, 0, 0, $new_width, $new_height, $old_width, $old_height);
switch(strtolower($last4)) {
case '.jpeg':
imagejpeg($tmp_img, $pathToThumb);
break;
case '.jpg':
imagejpeg($tmp_img, $pathToThumb);
break;
case '.png':
imagepng($tmp_img, $pathToThumb);
break;
case '.gif':
imagegif($tmp_img, $pathToThumb);
break;
default:
exit('Unsupported type: '. $pathToImage);
}
imagedestroy($tmp_img);
imagedestroy($img);
}
} elseif (empty($file_basename)) {
$err[] = "Select a file to upload";
} elseif ($filesize > 1024000) {
$err[] = "File size limit exceeded";
} else {
$err[] = "File type not allowed";
unlink($_FILES["file"]["tmp_name"]);
}
list($width, $height) = getimagesize("../images/store/big/$newfilename");
if ($width != "873" || $height != "581") {
$err[] = "File dimensions error";
unlink("../images/store/big/$newfilename");
unlink("../images/store/small/$newfilename");
}
?>
在body中我有文件上传字段so…
<input type="file" name="black1" disabled="1">
<input type="file" name="black2" disabled="1">
...
<input type="file" name="black7" disabled="1">
<input type="file" name="blue1" disabled="1">
<input type="file" name="blue2" disabled="1">
...
<input type="file" name="blue7" disabled="1">
等表示灰色、红色和白色。
就像我说的,如果有人能帮助我,我将非常感激。如果你能一直看到这里,再次感谢你花时间看完这些首先,不要为图像使用尺寸。尺寸并不能说明图像的大小。在网站上显示图片的关键是尺寸,而不是尺寸。
第二,为什么不使用多部分上传表单?在这里看到的。然后你的客户可以选择图像的颜色,并上传他们与一个选择,这将减少点击从35到7。或者如果您相信您的客户更精通技术:只使用一个输入字段,并指示他以特定的方式命名他的文件。例如"b_[文件名]"。[扩展]"黑色图像"。然后使用您喜欢的字符串搜索方法—例如RegEx—来识别图像类。