从数据库中检索文件时,文件已损坏

时间:2013-12-13 16:52:54

标签: php mysql file-upload corruption

在我的网站中,我想允许用户上传文件(它们将存储在数据库中),然后允许他们在此之后下载上传的文件。上传过程没有错误,并以二进制文件保存。

下载过程也有效,但下载的文件已损坏! 知道为什么吗?

上传代码:

<?php require_once('Connections/databasestudents.php'); ?>
<?php

$fileName = $_FILES['file']['name'];
$tmpName  = $_FILES['file']['tmp_name'];
$fileSize = $_FILES['file']['size'];
$fileType = $_FILES['file']['type'];

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

$studentId = $_POST['studentId'];
fclose($fp);

$query = "INSERT INTO file (studentId, fileName, fileType, fileContent ) ".
"VALUES ('$studentId', '$fileName', '$fileType', '$content')";

mysql_select_db($database_databasestudents, $databasestudents);
mysql_query($query) or die('Error, query failed'); 

header("Location: students.php");
die();

?>

下载代码:

<?php require_once('Connections/databasestudents.php'); ?>
<?php
mysql_select_db($database_databasestudents, $databasestudents);
$query = 'SELECT fileName, fileContent, fileType, LENGTH(fileContent) as fileSize from file WHERE id="'. $_GET ['id'].'";';

$Recordset1 = mysql_query($query, $databasestudents) or die(mysql_error());
$row_Recordset1 = mysql_fetch_assoc($Recordset1);

$result = mysql_query($query);
$row = mysql_fetch_array($result, MYSQL_BOTH);
$size = $row['fileSize'];
$type = $row['fileType'];
$name =$row['fileName'];
$fileContent = $row['fileContent'];
echo $size . "". $type . " ". $name;

header("Content-length: $size");
header("Content-type: $type");
header("Content-Disposition: attachment; filename=$name");
echo $fileContent;

mysql_close();
?>

2 个答案:

答案 0 :(得分:2)

  1. 使用PDO和预准备语句。这可能会解决问题,它将修复下载代码中的SQL注入漏洞(目前允许人们破解您的数据库)。

  2. PDO拥有“大对象”(LOB)支持,正是为了你正在做的事情。它比你目前正在做的更有效率。 documentation提供了极好的示例代码,它或多或少地完全符合您的要求。

答案 1 :(得分:1)

我已经弄清楚了..从下载代码中删除此行:

echo $size . "". $type . " ". $name;