【问题标题】:Files are corrupted when they are retrieved from database从数据库中检索文件时已损坏
【发布时间】:2013-12-13 16:52:53
【问题描述】:

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

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

上传代码:

<?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();
?>

【问题讨论】:

  • 你为什么首先在你的数据库中上传文件,而不是它们的路径?
  • 表名:文件。字段:文件内容。类型:longblob
  • 我不知道该怎么做:s
  • mysql_* 已弃用。我建议不要使用它。

标签: php mysql file-upload corruption


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

  2. PDO 具有“大对象”(LOB) 支持,这意味着您正在做的事情。它会比你现在做的更有效率。 documentation 提供了出色的示例代码,它或多或少完全符合您的要求。

【讨论】:

    【解决方案2】:

    我已经想通了..只需从下载代码中删除这一行:

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

    【讨论】:

    • 你在下载的代码中还有一个SQL注入,代码效率极低。请考虑使用 PDO - 我在答案中链接的示例代码几乎正是您所需要的,所以它不应该做太多的工作。
    • 嗯,我很想,但我对 php 和 sql 都是新手,我不知道如何修改代码.. 我担心我会破坏现在正在工作的东西跨度>
    • 在更改任何内容之前复制您的代码,然后尝试 - 这是最好的学习方式!如果您不理解某些内容,请查看php.net 上的文档(您可能应该阅读一些有关 PDO 的内容 - 查看示例并尝试理解它们,现在很难说它将来会对您有很大帮助 -这是值得的!)
    猜你喜欢
    • 1970-01-01
    • 2016-11-10
    • 2015-06-09
    • 2015-07-01
    • 2018-11-21
    • 2011-12-25
    • 2010-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多