0

上传.php

<form enctype="multipart/form-data" action="uploader.php" method="POST">
Choose a file: <input name="uploadedfile" type="file" /><br />
Choose a file1: <input name="uploadedfile1" type="file" /><br />
<input type="submit" value="Upload File" />
</form>

上传表单的屏幕截图

^ upload.php 的图片^

上传者.php

<?php
mysql_select_db("test");

$target_path = "uploads/" . basename( $_FILES['uploadedfile']['name']);
$target_path1 = "upload1/" . basename( $_FILES['uploadedfile1']['name']);
$currentfile = $_FILES['uploadedfile']['name']; 
$currentfile1 = $_FILES['uploadedfile1']['name']; 

$dbfiles = mysql_query("SELECT * FROM new WHERE amount='$currentfile' || amount='$currentfile1'");
if(mysql_num_rows($dbfiles) > 0 )
{ 



}
else
{
        if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path))
        {
                echo "file1: ".$_FILES['uploadedfile']['name']."<br>";
                $file1 = basename( $_FILES['uploadedfile']['name']);
                mysql_query("insert into new (amount) values('$file1')");   
        }
        if(move_uploaded_file($_FILES['uploadedfile1']['tmp_name'], $target_path1))
        {
                echo "file2: ".basename( $_FILES['uploadedfile1']['name']);
                $file2 = basename( $_FILES['uploadedfile1']['name']);
                mysql_query("insert into new (amount) values('$file2')");   
        }
}
?>

介绍和问题

此代码将允许用户上传 2 个文件,然后他们各自的文件名将保存到新的(表名),我需要将其保存在表中,以便我有历史记录谁是文件的上传者,并且可以简单地检索它或下载它。第一个按钮是文件中将保存在uploads文件夹中的uploadfile,然后下面的按钮是文件中将保存在upload1中的uploadfile1 ,当用户在这2个按钮中放置2个文件时,用户单击save,它将保存到他们准备好的文件夹(uploads 或 upload1),当用户仅在按钮 uploaderfile 或 uploaderfile1 中附加一个文件并单击上传文件/保存/提交时,它仍会将其文件名保存到新表并将文件保存在以下文件夹中(upload1 的上传)。

问题是当用户上传相同的文件名时,例如 abc.jpg 已经存在于表和文件夹中(upload1 的上传),但有些用户也上传了 abc.jpg .. 问题出在文件夹中(upload1的上传)abc.jpg 将只有一个(一个 pcs..),因为相同的文件名..我认为解决方案是重命名,其中当前上传的 abc.jpg 将变为 abc_1.jpg,也在表abc_1.jpg 将被保存..

4

1 回答 1

1

您不应该以原始名称保存文件。

更好的做法是在数据库中为文件分配一个唯一标识符,并为文件名使用相同的标识符。

然后有一个下载页面,它从数据库中检索文件路径和原始名称,并将其发送给用户readfile并设置相关标题:

header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="'.basename($file_name).'"');
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: '.filesize($file_path));
ob_clean();
flush();
readfile($file_path);
die();

从安全的角度来看,这也更好,因为用户不再需要知道或访问服务器上的文件位置,因此如果他们上传任何恶意内容,他们将无法直接调用该文件。

编辑:

要应用此功能,您需要有一个用于上传文件的表格,其中包含一个自动递增的 ID 字段。

mysql_query然后,您可以使用(因为您已经在示例中使用它)将原始文件名和其他相关信息插入数据库。然后,您需要将查询传递给该查询,该查询mysql_insert_id将为您提供刚刚插入的行的唯一标识符。使用它来命名您的文件,然后在您的上传文件夹中添加“.dat”扩展名。

在下载时,有一个下载页面,它通过查询字符串或 post 参数获取一个 id,然后使用它在数据库中查找信息。您可以找出给定 ID 的文件名,因为这是您最初用来存储它的文件名。

获得文件路径和原始名称后,您可以使用上面的代码向用户展示下载内容(如果您将其称为其他名称,则在替换$file_name并使用您自己的参数之后)。$file_location

下载页面还需要处理是否允许用户下载文件的任何检查。

于 2012-11-09T07:02:48.683 回答