试图通过PHP / MySQL下载Blob

时间:2013-02-21 18:28:28

标签: php mysql download blob

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

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

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

  

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

     

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

3 个答案:

答案 0 :(得分:6)

此:

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

不会产生你所期望的。如果您查看wireshark中的标头,或查看请求的其他方法,您将看到它不包含整数。

请改用:

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

答案 1 :(得分:0)

在痛苦地将其固定到位(也就是与其他html和代码在同一页面上)后,我决定将其移至专用的PHP页面。之后,它运作良好。

感谢您的评论!

答案 2 :(得分:-1)