【问题标题】:upload multiple files php and mysql上传多个文件php和mysql
【发布时间】:2011-12-27 09:21:42
【问题描述】:

我正在尝试允许用户上传任意数量的图像,将它们全部放在基于表单标题的新目录中,然后将该文件夹名称写入数据库,稍后我将调用它做一个图像转储。

所以我已经为此工作了好几天,并且已经走到了这一步

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>

现在一切正常,除了实际将文件复制并写入新目录,我坐在这里摆弄它,但我觉得我真的很接近,可能有人有钥匙,我就是不能把它从我的头顶上弄清楚。任何帮助都会很棒,谢谢。

【问题讨论】:

  • 正确格式化你的html代码。目前html代码作为重复属性。
  • 好吧,我知道它与我有关 '$destination' 我不知道如何将$new_dir$new_img 结合起来,所以它将是url/folder/image.jpg
  • 我一直在做 required 和 required="required" ,因为我不记得哪一个,但其中一个需要在 firefox 中工作,另一个用于 ie
  • 为什么要复制而不是 move_uploaded_file?
  • 你应该使用move_uploaded_file(),而不是copy()。

标签: php mysql file-upload upload


【解决方案1】:

让我们看看我可以列出多少种方法来说明你的代码有多可怕:

  1. 您正在使用原始 POST 在您的服务器上创建一个目录。您没有过滤此帖子字段以查找路径字符,因此实际上您是让远程用户在您的服务器上创建一个目录,让他们选择任何地方
  2. 您正在分析文件扩展名以确定文件类型。暂时忽略 $_FILES 数组中的 name 参数是为用户提供的文件的名称,您正在使用子字符串操作来获取文件的扩展名,而忽略了为您执行此操作的 pathinfo() 函数.回到文件名,没有什么能阻止恶意用户将“nastyvirus.exe”重命名为“kittens.jpg”并将其上传到您的服务器。
  3. 您不会以任何方式/形状/形式检查上传是否成功 - 您只是假设一切正常并开始处理上传的文件。上传成功只有一种方式,而失败则有几万亿种方式……也许您应该进行一些错误检查 - 这就是 _FILES 数组中存在 error 参数的原因。
  4. 我会告诉你这么多:你没有使用原始文件名来存储文件,而是盲目地生成一个新文件名,然后不检查你是否会覆盖以前上传的文件。完全有可能两个不同的用户会选择相同的标题并同时上传两个不同的文件 - 然后您的脚本会用另一个文件覆盖其中一个文件。
  5. 您正在使用copy() 在上传后移动文件。这是一个坏主意。为此目的有move_uploaded_file()。除了明显的 MOVE 操作外,它还有一些额外的安全检查,以确保在上传完成和脚本处理文件之间的时间内文件在服务器上没有被篡改。 copy 会从字面上复制文件,导致(在短时间内)服务器上的数据翻倍,这是浪费空间。而在大文件上,复制操作需要相当长的时间。相比之下,文件系统内的移动几乎是瞬时的。

  6. 您说您允许上传多个文件,但您的脚本只检查第一个文件[0]。如果要处理多个文件,则需要循环执行此代码,例如foreach(array_keys($_FILES['image']['name']) as $i) { ... },然后使用[$i] 而不是[0]

  7. 除此之外,您的 HTML 中还有 requiredrequired="required",这简直是浪费空间。使用其中一种,但不能同时使用。
  8. 你有$new_dir &amp;&amp; $new_file&amp;&amp; 不是 PHP 中的连接运算符,它是布尔 AND 运算符。您没有将字符串分配给$destination,而是存储了该布尔值的结果,例如真假。

【讨论】:

  • 哇,谢谢大家的建议,我一定会考虑的
  • 老实说,我不是这方面的原始程序员,我只是在一天前接受了这个,因为实际上没有任何效果,所以我正在尝试修复所有问题,到处都是 $sql 错误这个地方
  • 好的,谢谢,现在我不会让这段代码看起来像四年级学生那样
【解决方案2】:

您必须对每个上传的文件进行迭代和copy / move_uploaded_file,这就是您访问文件$_FILES['image']['tmp_name'][0] 的方式。 move_uploaded_file 最适合这个。

【讨论】:

    猜你喜欢
    • 2012-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-08
    • 2011-05-09
    • 1970-01-01
    相关资源
    最近更新 更多