2011-11-11 36 views
0

我想允许用户上传尽可能多的图像,将它们全部放在基于表单标题的新目录中,然后将该文件夹名称写入数据库并稍后我会调用它来执行映像转储。上传多个文件php和mysql

所以我一直在这个多天,现在,已经得到了这么远

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> 

而现在一切正常,与实际复制的例外并将这些文件写入新的目录,我坐在这里摆弄它,但我觉得我真的很接近,有人可能有钥匙,我无法想象它从我的头顶。任何帮助将是伟大的,谢谢。

+0

在适当的格式化您的html代码。目前HTML代码为重复属性。 –

+0

嗯,我知道它跟我有什么关系'$ destination'我不知道如何使用'$ new_dir'并将它与'$ new_img'结合,因此它将成为'url/folder/image.jpg' –

+0

我因为我不记得哪一个,但其中的一个需要在Firefox中工作,另一个为 –

回答

3

让我们看看我有多少种方法在你的代码是如何疯狂可怕的名单:

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

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

  7. 除此之外,您的HTML中有requiredrequired="required",这只是浪费空间。使用其中一种,但不能同时使用。
  8. 您已得到$new_dir && $new_file&&不是PHP中的连接运算符,它是一个布尔AND运算符。您没有为$destination分配字符串,您正在存储该布尔值的结果,例如对或错。
+0

感谢所有的建议,我会确保考虑到 –

+0

,并且要诚实诚实,我不是原来的程序员,我只是在一天之前接受了这一点,因为没有任何工作,所以我试图修复一切,theres $ sql错误到处 –

+0

好吧,我得到了它的工作感谢,现在我正在努力不要让这个代码看起来像一个四年级的学生做到了 –

1

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