从SQL数据库下载文件时出错

时间:2013-11-17 19:34:38

标签: php mysql sql mysqli

我正在运行一个网站,该网站的一部分允许用户将文件上传到SQL数据库,然后下载它们。下载本身有效,但文件已损坏。无法打开图像文件,doc文件显示为空白。我将在我的上传脚本和我的下载脚本下面附上。

  $classid = $_POST['uploadclass'];
$userid = $_SESSION['id'];
$view = $_POST['view']; 

$filename = $_FILES['uploadfile']['name'];
$tmpname = $_FILES['uploadfile']['tmpname'];
$filesize = $_FILES['uploadfile']['size'];
$filetype = $_FILES['uploadfile']['type'];

$fp = fopen($tmpname, 'r');
$content = fread($fp, filesize($tmpname));
$content = addslashes($content);
fclose($fp);

if (!get_magic_quotes_gpc()){
 $filename = addslashes($filename);
}
$query = "INSERT INTO uploads VALUES('','$filename', '$filetype', '$filesize', '$content', '$userid', '$classid', '$view', 'no')";
$run = mysqli_query($connect, $query);

mysqli_close($connect);
header('location: files.php');

以下是我的下载页面的代码。

$query = "SELECT * FROM uploads WHERE id=$id";
$run = mysqli_query($connect, $query);
while ($row = mysqli_fetch_assoc($run)){
$name = $row['name'];
$type = $row['type'];
$size = $row['size'];
$content = $row['content'];

}
header("Content-length: $size");
header("Content-type: $type");
header("Content-Disposition: attachment; filename=$name");
echo $content;
?>

1 个答案:

答案 0 :(得分:1)

将数据插入数据库时​​,您正在错误地处理文件和其他所有内容。已存在的所有文件都已损坏,可能已被破坏。

addslashes()不是数据库的转义函数。始终使用您正在使用的数据库扩展附带的转义功能。如果您使用的是mysqli,那么正确的函数必须是mysqli_real_escape_string()

但是,您应该查看准备好的陈述。这些将使用不同的方式传输不需要转义的数据。但请注意魔术引号的设置。首选设置为OFF,最近以5.4开头的PHP版本已经删除了此功能。因此,您必须处理转移到数据库中的数据。