3

这是我无法弄清楚的:我已经成功地在网页上构建了一个上传功能,以将文件上传到 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
?>
4

3 回答 3

6

这:

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

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

改用这个:

header("Content-length: ".strlen($filedata));
于 2013-02-21T18:33:28.090 回答
0

在对就地修复它(即与其余 html 和代码在同一页面上)苦恼之后,我决定将它移动到一个专用的 PHP 页面。在那之后,它工作得很好。

感谢您的评论!

于 2013-02-21T19:15:13.090 回答
-1

这是很好的例子和完整的源代码

于 2013-07-31T08:55:14.860 回答