我试图让用户上传任意数量的图片,根据表单标题将它们全部放在一个新目录中,然后将该文件夹名称写入数据库,稍后我将调用它做一个图像转储。
所以我已经为此工作了很多天,并且已经走到这一步
if(isset($_POST['Submit']))
{ $ttitle = $_POST['ttitle'];
$file_dir = './../img/treatments/';
foreach( $_FILES as $file_name => $file_array ){
$current_image=$_FILES['image']['name'][0];
$extension = substr(strrchr($current_image, '.'), 1);
if (($extension!= "png") && ($extension != "jpg"))
{
die('Unknown extension');
}
$time = date("fYhis");
$new_image = $time . "." . $extension;
$new_dir = mkdir("./../img/treatments/" . $ttitle, 0700);
$destination= $new_dir && $new_image;
$action = copy($_FILES['image']['tmp_name'], $destination);
}
$last_name = $_POST['last_name'];
$username = $_POST['username'];
$pass = $_POST['pass'];
$text = $_POST['text'];
$bio = $_POST['bio'];
$tsub = $_POST['tsub'];
$image = $ttitle;
if (!$action)
{
die('File copy failed');
}else{
echo "File copy successful";
}
然后是html表单
<form method='post' enctype='multipart/form-data' action='#'>
<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr><td width="40%" class="right">
Title: </td><td width="60%" class="left"><input type="text" autofocus autofocus="autofocus" required required="required" name="ttitle" maxlength="255"
/>
*</td></tr><tr><td class="right">
Subtitle:</td><td class="left"> <input type="text" required required="required" name="tsub" maxlength="255"
/>
*</td></tr><tr><td class="right">
Username: </td><td class="left"><input type="text" required required="required" name="username" maxlength="255"
/>
*</td></tr><tr><td class="right">
Password: </td><td class="left"><input type="password" required required="required" name="pass" maxlength="255"
/>
*</td></tr>
<tr><td class="right">
Confirm Password: </td><td class="left"><input type="password" required required="required" name="pass2" maxlength="255"
/>
*</td></tr><tr><td class="right">Proposed Director
</td><td class="left"><input type="text" name="dir" maxlength="255"
/>
*</td></tr><tr><td class="right">Proposed Additional
</td><td class="left"><input type="text" name="add" maxlength="255"
/></td></tr><tr><td class="right" valign="top">
Text: </td><td class="left" valign="top"><textarea required required="required" name="text"></textarea>
*</td></tr><tr><td class="right">
Bobblehead: </td><td class="left">
<input type="file" required required="required" name="image[]" multiple="">
*</td></tr> </table>
现在一切正常,除了实际将文件复制和写入新目录外,我坐在这里摆弄它,但我觉得我真的很接近,有人可能有 key ,我就是做不到把它从我的头上弄清楚。任何帮助都会很棒,谢谢。
最佳答案
让我们看看我可以用多少种方式来说明您的代码有多糟糕:
- 您正在使用原始 POST 在您的服务器上创建一个目录。您没有为路径字符过滤此帖子字段,因此实际上您让远程用户在您的服务器上的任何地方创建一个他们选择的目录
- 您正在分析文件扩展名以确定文件类型。暂时忽略 $_FILES 数组中的
name
参数是为用户提供的文件名,您正在使用子字符串操作获取文件的扩展名,忽略pathinfo ()
函数,它会为你做这件事。回到文件名,没有什么可以阻止恶意用户将“nastyvirus.exe”重命名为“kittens.jpg”并将其上传到您的服务器。 - 您不会以任何方式/形状/形式检查上传是否成功 - 您只是假设一切正常并开始处理上传的文件。上传成功只有一种方法,上传失败有几万亿种方法……也许您应该进行一些错误检查 - 这就是 _FILES 数组中存在
error
参数的原因。< - 我会给你这么多:你没有使用原始文件名来存储文件,而是盲目地生成一个新文件名,然后不检查你是否会覆盖以前上传的文件。两个不同的用户完全有可能选择相同的标题并同时上传两个不同的文件 - 然后您的脚本将用另一个文件覆盖其中一个文件。
您正在使用
copy()
在上传后移动文件。这是一个坏主意。move_uploaded_file()
就是为了这个目的。除了明显的 MOVE 操作外,它还有一些额外的安全检查,以确保在上传完成和您的脚本处理文件之间的时间内文件在服务器上没有被篡改。 copy 将逐字复制文件,导致(在短时间内)服务器上的数据翻倍,这是一种空间浪费。而在大文件上,复制操作会花费相当长的时间。相比之下,文件系统内的移动几乎是瞬时的。您说您允许上传多个文件,但您的脚本只检查第一个
[0]
。如果您想处理多个文件,则需要在循环中执行此代码,例如foreach(array_keys($_FILES['image']['name']) as $i) { ... }
然后使用[$i]
而不是[0]
。- 除此之外,您的 HTML 中还有
required
和required="required"
,这简直是浪费空间。使用其中之一,但不能同时使用。 - 你有
$new_dir && $new_file
。&&
不是 PHP 中的串联运算符,它是 bool AND 运算符。您不是将字符串分配给$destination
,而是存储该 bool 值的结果,例如对还是错。
关于php - 上传多个文件php和mysql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8100646/