【问题标题】:Trying to download Blob via PHP / MySQL尝试通过 PHP / MySQL 下载 Blob
【发布时间】:2013-02-07 05:08:55
【问题描述】:

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

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

此外,不同的浏览器在 POST 后显示不同。尝试下载 txt 文件时,IE 将在页面本身的 ECHO 中显示正确的数据(不下载),并在其前面显示错误消息:

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

第 82 行是 'header("Content-length...'

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
?>

【问题讨论】:

  • 哎呀。您正在使用 PDO 并且 仍然 没有绑定参数,并且您使自己容易受到 SQL 注入的攻击。 (为了您自己的利益)查看 PDO 上的 bindValueprepare。在更改标头之前,您还 echoing SQL。除非启用输出缓冲,否则这将导致不发送标头。
  • 是的……我是个坏孩子。这实际上仅供一小部分员工在内部使用,但我明白了。将重写。
  • 即使是内部使用也很重要。如果代码是这样编写的,那么在员工离开时造成一些损害并不能阻止他们!我只是想帮你。但在你的内部组织中,你比我更了解。
  • 刚输出的时候,还要不要绑定参数并使用prepare?
  • 是的,你应该总是逃跑。相信我,如果当你问“我应该逃离 X 吗?”时,你会对你自己和你的公司有所帮助。你总是回答“是”。

标签: php mysql download blob


【解决方案1】:

这个:

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

不会产生您期望的结果。如果您查看wireshark 中的标头,或者查看请求的其他方法,您会发现它不包含整数。

改用这个:

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

【讨论】:

  • 谢谢你!我不再收到 IE 消息,但所有文件的开头仍然附加了 HTML 代码。加克。
  • 您的代码当前正在回显SQL语句,在回显文件数据之前您还有其他输出吗?
  • 我在发布后删除了 echo $sql。没有运气。
  • 不。只是从我的头文件开始,然后连续到页面的末尾。所有页面 HTML 都包含在文件中。我之前读过空格和输出可以做一些事情来破坏这一点。我应该通过表单调用一个单独的、隔离的 PHP 页面吗?
  • 我认为您确实需要隔离这一点。您需要确保在没有生成其他 html 的上下文中调用它。
【解决方案2】:

在原地修复它(即与其余 html 和代码在同一页面上)苦恼之后,我决定将它移动到一个专用的 PHP 页面。之后,它运行良好。

感谢cmets!

【讨论】:

    【解决方案3】:

    【讨论】:

    • 我认为这要么是过时的,要么是垃圾邮件。
    猜你喜欢
    • 1970-01-01
    • 2020-02-05
    • 1970-01-01
    • 1970-01-01
    • 2015-12-12
    • 2017-01-06
    • 2011-12-18
    • 2021-10-09
    • 1970-01-01
    相关资源
    最近更新 更多