gpt4 book ai didi

php - 使用 PHP 将图像上传到文件夹,同时将描述保存到数据库

转载 作者:行者123 更新时间:2023-11-29 04:55:49 25 4
gpt4 key购买 nike

用户决定为其分类列表上传多张图片。我需要做的是:

  1. 上传图片以及每张图片的说明 - 已解决
  2. 将图片保存到指定文件夹
  3. 将图像位置连同描述保存到我的 MySQL 数据库中 - 已解决
  4. 能够在画廊设置中调用分类列表中的图像和描述

我的表架构是这样设置的(简化):

ad_id | member_id | category | subcategory | ... | photo_0_href | photo_0_desc ... | etc.

有人可以指导我完成整个过程吗?谢谢。

step3.php

<form action="upload.php" method="post" enctype="multipart/form-data">
<p>
<label for="file0">Filename: </label>
<input name="file[]" type="file" id="file0" size="20" />
</p>
<p>
<label for="file0desc">Description: </label>
<textarea rows="10" cols="30" id="file0desc" class="textarea"></textarea>
</p>
<p>
<label for="file1">Filename: </label>
<input name="file[]" type="file" id="file1" size="20" />
</p>
<p>
<label for="file1desc">Description: </label>
<textarea rows="10" cols="30" id="file1desc" class="textarea"></textarea>
</p>
<p>
<input id="submit" type="submit" name="submit" value="Continue to Step 4" />
</p>
</form>

上传.php

<?php

if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/pjpeg")
|| ($_FILES["file"]["type"] == "image/png"))
&& ($_FILES["file"]["size"] < 1048600)) // less than 1MB
{
if ($_FILES["file"]["error"] > 0)
{
echo "Return Code: " . $_FILES["file"]["error"] . "<br />";
}
else
{
header("Location: step4.php");
/*
echo "Upload: " . $_FILES["file"]["name"] . "<br />";
echo "Type: " . $_FILES["file"]["type"] . "<br />";
echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />";

*/
if (file_exists("upload/" . $_FILES["file"]["name"]))
{
echo $_FILES["file"]["name"] . " already exists. ";
}
else
{
move_uploaded_file($_FILES["file"]["tmp_name"],
"upload/" . $_FILES["file"]["name"]);
echo "Stored in: " . "upload/" . $_FILES["file"]["name"];
}
}
}
else
{
echo "Invalid file";
}
?>

我知道我的 upload.php 还没有为多个图像文件配置,但这是一个开始。

我设法使用 $_SESSION['file_n_desc'] 将描述保存到数据库中。我只需要弄清楚如何将该死的图像上传到文件夹,然后将位置保存到数据库中。

我还需要将图像重命名为随机字符串(以防止图像被覆盖)。我知道我可以使用 rand() 函数来做到这一点。

最佳答案

1) 上传文件

当对文件输入使用数组语法时,文件索引是最后一个键。例如,$_FILES["file"]["name"] 是一个文件名数组。要获取第 i 个文件的信息,您需要访问 $_FILES["file"]["name"][$i], $_FILES["file"]["尺寸"][$i] &c.

2) 保存图片到文件夹

$_FILES中的部分数据(如姓名)来自客户端,不可信(即先验证)。在 file name 的情况下,您可以先使用 realpath验证目标文件路径名是否安全,或使用 basenamepathinfo在组装目标路径名之前提取所提供名称的最后一个组件。

3) 保存图片信息到DB

您提供的(不完整的)数据库模式看起来像是您在同一个表中为每个图像提供了两列。在关系模型下,对多关系使用单独的表建模:

CREATE TABLE images (
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
`path` VARCHAR(256) NOT NULL,
`description` TEXT,
`member` INT UNSIGNED NOT NULL,
FOREIGN KEY `member` REFERENCES members (`id`) ON DELETE CASCADE ON UPDATE CASCADE -- the image's owner
) Engine=InnoDB;

-- Note: this is a many-to-many relationship
CREATE TABLE ad_images (
`ad` INT UNSIGNED NOT NULL,
`image` INT UNSIGNED NOT NULL,
FOREIGN KEY `ad` REFERENCES ads (`ad_id`) ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY `image` REFERENCES images (id) ON DELETE CASCADE ON UPDATE CASCADE,
UNIQUE KEY (`ad`, `image`)
) Engine=InnoDB;

否则,您将破坏 zero-one-infinity当图像数量少于最大数量时,规则和浪费空间。

其他

请注意,您可以对文件描述字段使用数组语法,以便更轻松地处理它们。将它们命名为“filedesc[]”。

与其进行长序列比较,不如使用数组查找或模式匹配。

function isImage($type) {
static $imageTypes = array(
'image/gif'=>1, 'image/jpeg'=>1, 'image/pjpeg'=>1, 'image/png'=>1,
);
return isset($imageTypes[$type]);
/* OR */
return preg_match('%^image/(?:p?jpeg|gif|png)%', $type);
/* OR allow all images */
return preg_match('%^image/%', $type);
}

if (isImage($_FILES["file"]["type"][$idx]) && ($_FILES["file"]["size"][$idx] < 1048600)) {

文件类型是客户端提供的值之一。更安全的是使用 fileinfo获取图像类型。

$finfo = finfo_open(FILEINFO_MIME_TYPE);

if (isImage(finfo_file($finfo, $path)) && ($_FILES["file"]["size"][$idx] < 1048600)) {

如果文件具有有效的图像标题但其余部分无效,即使这样也可能被愚弄。您可以使用 image library (例如 GD 或 ImageMagick)通过检查您是否可以将文件作为图像成功打开来验证文件。

关于php - 使用 PHP 将图像上传到文件夹,同时将描述保存到数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6694839/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com