我目前正在开发一个脚本,用户可以在该脚本中向表单添加字段组并包含图像 问题是我不知道从哪里开始在多维数组中上传文件。
到目前为止,我已经构建了表单:http://letsfixit.co.uk/fortest.php并让它使用添加字段组并创建数组,但到目前为止还没有任何关于获取文件的信息。我只能看到它将文件名作为字符串存储在数组中,就是它!
有没有办法使用foreach语句,只使用php的普通文件上传方法?像修改版本的东西:
if ($_FILES["file"]["error"] > 0) {
echo "Return Code: " . $_FILES["file"]["error"] . "<br>";
} else {
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"];
}
}
我遇到的唯一问题是当表单发布时,$ _FILES中没有任何内容,它只是一个空数组
答案 0 :(得分:1)
这是最后的编辑 -
您错过了表单中的“enctype”选项:
我无法让你的php脚本工作。这是一种方法......
imo,你在客户端工作太辛苦了。 PHP将为您整理输入字段数组。目前,在客户端上,您正在尝试通过生成自己的索引来组织每个步骤的所有数据。我建议不要打扰。使用数组窗口小部件名称但固定的名称,并收集每个步骤服务器端的所有数据。它简化了您的javascript,因为您只是复制字段组但不更改名称。
Serverside PHP将所有输入排列在单独的数组中。这很好,因为每个数组的第一行是第1步,第二行是“第2步”等。
无论如何,这是一个“两步”形式和上传脚本,可以运行并且已经过测试。
<?php
if (!empty($_FILES)) {
// var_dump($_POST);
// foreach($_FILES as $key => $value){
// var_dump($key, 'the key', $value, 'the value');
// }
// var_dump($_FILES["steps"]["error"]["image"], '$_FILES["steps"]["error"]["image"]');
// all valid steps in here...
$theOutputSteps = array();
/*
* Please note there are separate arrays.
* But any ONE index value across all arrays is the complete record!
*
* This works 'cos empty values still come in and php makes them...
*/
// we need to pick something to drive off... I use '$_POST[steps][title].
// It does not matter as all the input arrays are the exact same size.
/*
* let us start to reassemble the information into a useable form...
*/
foreach($_POST['steps']['title'] as $key => $value) {
$curStep = array();
$curStep['title'] = $value;
$curStep['description'] = $_POST['steps']['description'][$key];
// file details...
$curStep['image']['error'] = $_FILES["steps"]["error"]["image"][$key];
if (!$curStep['image']['error']) { // save the file
$curStep['image']['name'] = $_FILES["steps"]["name"]["image"][$key];
$curStep['image']['type'] = $_FILES["steps"]["type"]["image"][$key];
$curStep['image']['size'] = $_FILES["steps"]["size"]["image"][$key];
$curStep['image']['tmp_name'] = $_FILES["steps"]["tmp_name"]["image"][$key];
if (!file_exists('./upload/'.$curStep['image']['name'])) {
move_uploaded_file($curStep['image']['tmp_name'],
'./upload/'.$curStep['image']['name']);
}
else {
$curStep['image']['error'] = "file already exists: ". $curStep['image']['name'];
}
}
$theOutputSteps[] = $curStep;
}
var_dump($theOutputSteps, '$theOutputSteps');
}
?>
<form id="steps" method="POST" action="" enctype="multipart/form-data">
<div id="p_scents">
<p>
<label for="p_title_scnt"><input type="text" id="p_title_scnt" size="20" name="steps[title][]" value="Step 1" placeholder="Input Value" /></label> <br />
<label for="p_step_scnt"><textarea id="p_step_scnt" name="steps[description][]" ></textarea></label> <br />
<label for="p_image_scnt"><input type="file" id="p_image_scnt" name="steps[image][]" value="" /></label>
</p>
<p>
<label for="p_title_scnt"><input type="text" id="p_title_scnt" size="20" name="steps[title][]" value="Step 2" placeholder="Input Value" /></label> <br />
<label for="p_step_scnt"><textarea id="p_step_scnt" name="steps[description][]" ></textarea></label> <br />
<label for="p_image_scnt"><input type="file" id="p_image_scnt" name="steps[image][]" value="" /></label>
</p>
</div>
<a href="#" id="addScnt">Add Another Input Box</a><br /><br />
<input type="submit" value="Post Guide">
</form>