试图通过PHP/MySQL下载Blob

试图通过PHP/MySQL下载Blob,php,mysql,download,blob,Php,Mysql,Download,Blob,这是一个我无法理解的问题:我已经成功地在网页上构建了一个上传功能,可以将文件上传到MySQL数据库。当我在服务器上通过phpMyAdmin打开它们时,它们看起来都很好。。。txt、jpg、pdf等 然而,在把这个东西(下面)放在一起下载之后,我遇到了一个奇怪的问题:所有的文本文档(以及所有其他类型的文件,在我将扩展名改为“txt”后)都包含页面本身的HTML代码,后面是原始内容 此外,不同的浏览器在发布后显示的内容也不同。当尝试下载txt文件时,IE将在页面本身的回显中显示正确的数据(无下载),

这是一个我无法理解的问题:我已经成功地在网页上构建了一个上传功能,可以将文件上传到MySQL数据库。当我在服务器上通过phpMyAdmin打开它们时,它们看起来都很好。。。txt、jpg、pdf等

然而,在把这个东西(下面)放在一起下载之后,我遇到了一个奇怪的问题:所有的文本文档(以及所有其他类型的文件,在我将扩展名改为“txt”后)都包含页面本身的HTML代码,后面是原始内容

此外,不同的浏览器在发布后显示的内容也不同。当尝试下载txt文件时,IE将在页面本身的回显中显示正确的数据(无下载),并在其前面显示一条错误消息:

警告:标题不能包含多个标题,检测到新行。在C:\wamp\www\ace\dmain.php的第82行

第82行是“标题”(“内容长度…”)

Firefox和Chrome都没有显示任何内容。他们只允许我下载

代码如下:

<?php
if (isset($_POST['downloadid'])) {
    $fileid = $_POST['downloadid'];
    try {
      $sql = "SELECT * FROM `datastore` WHERE `id` = '".$fileid."'";
        $results = $pdo->query($sql);echo $sql;
        while ($row = $results->fetch()) {
            $filename = $row['filename'];
            $mimetype = $row['mimetype'];
            $filedata = $row['filedata'];
            header("Content-length: strlen($filedata)");
            header("Content-type: $mimetype");
            header("Content-disposition: download; filename=$filename"); //disposition of download forces a download
            echo $filedata; 
            // die();
        } //of While
    } //try
    catch (PDOException $e) {
        $error = '<br>Database ERROR fetching requested file.';
        echo $error;
        die();    
    } //catch
} //isset
?>

这是:

header("Content-length: strlen($filedata)");
不会产生您期望的结果。如果您查看wireshark中的标头,或查看请求的其他方法,您将看到它不包含整数

改用这个:

header("Content-length: ".strlen($filedata));

在为将其修复到位(即与其他html和代码在同一页面上)而苦恼之后,我决定将其移动到一个专用的PHP页面上


感谢您的评论!

Yikes。您正在使用PDO,但仍然没有绑定参数,并且您使自己容易受到SQL注入的攻击。请(为了您自己的利益)查看PDO上的
bindValue
prepare
。在更改标题之前,您还将
echo
SQL。这将导致在启用输出缓冲之前不发送标题。是的……我是个坏孩子。这实际上只供一小部分员工内部使用,但我明白了重点。我将重写它。即使是r内部使用这很重要。如果代码是这样写的,那么在员工离开时,阻止他们造成一些损害就没什么了!我只是想帮你。但是在你的内部组织中,你比我更清楚。当只是输出时,我还应该绑定参数并使用prepare吗?是的,你应该总是逃避。Belie如果你问我,“我应该逃离X吗?”?"你总是回答“是”。谢谢你的回答!我不再收到IE消息了,但是所有文件的开头都附加了HTML代码。Gak。你的代码当前正在回显SQL语句,在回显文件数据之前你还有其他输出吗?我在发布此消息后删除了echo$SQL。不走运。在此之前还有其他输出不,只是从我的头文件开始,然后继续到页面的结尾。所有页面HTML都包含在文件中。我以前读过空格和输出可以破坏这一点。我应该通过表单调用一个单独的、孤立的PHP页面吗?我想你确实需要隔离它。你需要确保它在c中调用没有生成其他html的ontext。我认为这要么是过时的,要么是垃圾邮件。