【问题标题】:Corrupt file downloads from MySQL database using PHP使用 PHP 从 MySQL 数据库下载损坏的文件
【发布时间】:2015-01-15 09:37:38
【问题描述】:

每次我尝试下载时,它都会生成正确的文件名和扩展名(文件),但已损坏(通常大小为 1kb,无法打开,在这种情况下,我的文件是 .docx 格式,大小约为 12kb)。我正在使用 XAMPP,我使用 phpmyadmin 来查看我的 sql 数据库。上传脚本用于将文件从计算机存储到数据库。

这是我的上传脚本: - 根据答案编辑

<?php
session_start();
include("connect.php");
$nametemp=$_SESSION['name'];
$nistemp=$_SESSION['nislogin'];
$subjecttemp=$_SESSION['subject'];
$chapter=$_POST['chapter'];

$name=$_FILES['browsefile']['name'];
$mime=$_FILES['browsefile']['type'];
$data=file_get_contents($_FILES['browsefile']['tmp_name']);
$size=$_FILES['browsefile']['size'];

mysql_query("INSERT INTO assignment (name, mime, size, data, created, uploader, subject, chapter) VALUES ('$name', '$mime', '$size', '$data', NOW(), '$nametemp', '$subjecttemp', '$chapter')");

header("location:subject.php");
die();
?>

这里是下载脚本:-根据答案编辑

<?php
session_start();
include("connect.php");
$nametemp=$_SESSION['name'];
$nistemp=$_SESSION['nislogin'];
$classtemp=$_SESSION['class'];
$subjecttemp=$_SESSION['subject'];
$idtemp=$_GET['id'];

$query=("SELECT mime, name, size, data FROM assignment WHERE id='$idtemp'");
$result=mysql_query($query);
$filename=mysql_result($result,0,"name");
$filesize=mysql_result($result,0,"size");
$filemime=$type=mysql_result($result,0,"mime");
$filedata=mysql_result($result,0,"data");

header("Content-disposition: attachment; filename=$filename");
header("Content-length: $filesize");
header("Content-type: $filemime");
header("Content-transfer-encoding: binary");
echo $filedata;
?>

如果您想知道,这里是“分配”表结构的屏幕截图:image

【问题讨论】:

    标签: php mysql download


    【解决方案1】:

    $data=$_FILES['browsefile']['tmp_name'];

    您将上传文件的临时名称分配给“数据”列,而不是数据本身。 对此的快速修复是使用 file_get_contents 函数。

    第二:readfile 从磁盘读取文件,它不提供来自变量的输出流。不需要此行。

    但是:不建议将二进制文件保存在数据库中。最好将文件本身存储在上传文件夹中并保存它的名称。

    另外,更改下一行

    mysql_query("INSERT INTO assignment (name, mime, size, data, created, uploader, subject, chapter) VALUES ('$name', '$mime', '$size', '$data', NOW(), '$nametemp', '$subjecttemp', '$chapter')");
    

    进入

    mysql_query("INSERT INTO assignment (name, mime, size, data, created, uploader, subject, chapter) VALUES ('$name', '$mime', '$size', '" . mysql_real_escape_string($data) . "', NOW(), '$nametemp', '$subjecttemp', '$chapter')");
    

    接下来:请考虑更改为PDO,而不是使用旧的 Mysql_* 函数(它们已被弃用)。

    【讨论】:

    • 如果我没记错的话,file_get_contents() 用于文件存储在磁盘中而我的文件存储在数据库中时,我尝试将 echo $filedata 更改为 echo file_get_contents($filename) 和我得到的是一个包含一些 php 错误代码的 word 文档。
    • 您将文件上传到磁盘(临时),但从未将其插入数据库。这就是 file_get_contents() 的用武之地:您需要在上传文件中使用它。 $data = file_get_contents($_FILES['browsefile']['tmp_name']);
    • 但是我在表结构中看到我在询问/更改代码之前上传了一个文件,大小列是 12952(大约 12kb),数据列显示 [BLOB - 21 B],是那个文件不是上传成功了吗?
    • 抱歉重复发帖。我已经根据@Blaatpraat 的建议更改了代码,它仍然没有提供完整的文件(通常是 word 文件中的一些错误 php 代码和以字节为单位的大小而不是千字节)。我猜错误在下载脚本中。
    • 快速更新,我已尝试根据@Blaatpraat 的回答更改代码,文件无法上传且未存储在数据库中。
    猜你喜欢
    • 2015-07-16
    • 2012-03-31
    • 2014-06-05
    • 2015-10-12
    • 1970-01-01
    • 1970-01-01
    • 2014-09-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多