php - 显示图像时出错 - 从 PHP 和 MySQL 新手到 Ninja 的代码

标签 php mysql image

我是 PHP 和 MySQL 的新手,在 Kevin Yank 的书 - PHP & MySQL Novice to Ninja 的 2 章中,代码中存在错误。我唯一没有弄清楚的是第 12 章,并且尝试了本论坛和其他论坛上多个帖子的建议,但没有任何效果。预先感谢您的帮助

问题:Blob 出现加载问题:

The image "http://localhost/chapter12/filestore5/index.php?action=view&id=5" cannot be displayed because it contains errors

所有其他功能:上传、描述、删除都完美运行。

index.php 文件

<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/includes/magicquotes.inc.php';

if (isset($_POST['action']) and $_POST['action'] == 'upload') {

    // Bail out if the file isn't really an upload

    if (!is_uploaded_file($_FILES['upload']['tmp_name'])) {
        $error = 'There was no file uploaded!';
        include $_SERVER['DOCUMENT_ROOT'] . '/includes/error.html.php';

        exit();
    }

    $uploadfile = $_FILES['upload']['tmp_name'];
    $uploadname = $_FILES['upload']['name'];
    $uploadtype = $_FILES['upload']['type'];
    $uploaddesc = $_POST['desc'];
    $uploaddata = file_get_contents($uploadfile);
    include 'db.inc.php';

    try {
        $sql = 'INSERT INTO filestore SET
    filename = :filename,
    mimetype = :mimetype,
    description = :description,
    filedata = :filedata';
        $s = $pdo->prepare($sql);
        $s->bindValue(':filename', $uploadname);
        $s->bindValue(':mimetype', $uploadtype);
        $s->bindValue(':description', $uploaddesc);
        $s->bindValue(':filedata', $uploaddata);
        $s->execute();
    }

    catch(PDOException $e) {
        $error = 'Database error storing file!';
        include $_SERVER['DOCUMENT_ROOT'] . '/includes/error.html.php';

        exit();
    }

    header('Location: .');
    exit();
}

if (isset($_GET['action']) and ($_GET['action'] == 'view' or $_GET['action'] == 'download') and isset($_GET['id'])) {
    include 'db.inc.php';

    try {
        $sql = 'SELECT filename, mimetype, filedata
    FROM filestore
    WHERE id = :id';
        $s = $pdo->prepare($sql);
        $s->bindValue(':id', $_GET['id']);
        $s->execute();
    }

    catch(PDOException $e) {
        $error = 'Database error fetching requested file.';
        include $_SERVER['DOCUMENT_ROOT'] . '/includes/error.html.php';

        exit();
    }

    $file = $s->fetch();
    if (!$file) {
        $error = 'File with specified ID not found in the database!';
        include $_SERVER['DOCUMENT_ROOT'] . '/includes/error.html.php';

        exit();
    }

    $filename = $file['filename'];
    $mimetype = $file['mimetype'];
    $filedata = $file['filedata'];
    $disposition = 'inline';
    if ($_GET['action'] == 'download') {
        $mimetype = 'application/octet-stream';
        $disposition = 'attachment';
    }

    // Content-type must come before Content-disposition

    header('Content-length: ' . strlen($filedata));
    header("Content-type: $mimetype");
    header("Content-disposition: $disposition; filename=$filename");
    echo $filedata;
    exit();
}

if (isset($_POST['action']) and $_POST['action'] == 'delete' and isset($_POST['id'])) {
    include 'db.inc.php';

    try {
        $sql = 'DELETE FROM filestore
    WHERE id = :id';
        $s = $pdo->prepare($sql);
        $s->bindValue(':id', $_POST['id']);
        $s->execute();
    }

    catch(PDOException $e) {
        $error = 'Database error deleting requested file.';
        include $_SERVER['DOCUMENT_ROOT'] . '/includes/error.html.php';

        exit();
    }

    header('Location: .');
    exit();
}

include 'db.inc.php';

try {
    $result = $pdo->query('SELECT id, filename, mimetype, description
    FROM filestore');
}

catch(PDOException $e) {
    $error = 'Database error fetching stored files.';
    include $_SERVER['DOCUMENT_ROOT'] . '/includes/error.html.php';

    exit();
}

$files = array();

foreach($result as $row) {
    $files[] = array(
        'id' => $row['id'],
        'filename' => $row['filename'],
        'mimetype' => $row['mimetype'],
        'description' => $row['description']
    );
}

include 'files.html.php';

?>

HTML 文件

<?php 
    include_once $_SERVER['DOCUMENT_ROOT'] . '/includes/helpers.inc.php';
?>
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <title>PHP/MySQL File Repository</title>
    </head>
    <body>
        <h1>PHP/MySQL File Repository</h1>
        <form action="" method="post" enctype="multipart/form-data">
            <div>
                <label for="upload">Upload File:
                <input type="file" id="upload" name="upload"></label>
            </div>
            <div>
                <label for="desc">File Description:
                <input type="text" id="desc" name="desc"
                    maxlength="255"></label>
            </div>
            <div>
                <input type="hidden" name="action" value="upload">
                <input type="submit" value="Upload">
            </div>
        </form>
        <?php if (count($files) > 0): ?>
        <p>The following files are stored in the database:</p>
        <table>
            <thead>
                <tr>
                    <th>Filename</th>
                    <th>Type</th>
                    <th>Description</th>
                </tr>
            </thead>
            <tbody>
                <?php foreach($files as $f): ?>
                <tr>
                    <td>
                        <a href="?action=view&amp;id=<?php htmlout($f['id']); ?>
                            "><?php htmlout($f['filename']); ?></a>
                    </td>
                    <td><?php htmlout($f['mimetype']); ?></td>
                    <td><?php htmlout($f['description']); ?></td>
                    <td>
                        <form action="" method="get">
                            <div>
                                <input type="hidden" name="action"
                                    value="download"/>
                                <input type="hidden" name="id"
                                    value="<?php htmlout($f['id']); ?>"/>
                                <input type="submit" value="Download"/>
                            </div>
                        </form>
                    </td>
                    <td>
                        <form action="" method="post">
                            <div>
                                <input type="hidden" name="action" value="delete"/>
                                <input type="hidden" name="id"
                                    value="<?php htmlout($f['id']); ?>"/>
                                <input type="submit" value="Delete"/>
                            </div>
                        </form>
                    </td>
                </tr>
                <?php endforeach; ?>
            </tbody>
        </table>
        <?php endif; ?>
    </body>
</html>

最佳答案

最后回到修复代码并在这里找到了一个可行的解决方案: https://www.sitepoint.com/community/t/problem-using-php-to-pull-binary-files-from-a-blob-field-in-mysql/6431/16 我添加了“while (@ob_end_clean());”在index.php 中的magicquotes 之后,一切正常。 据此人在另一个论坛中发现,如果服务器打开了输出缓冲,则无法正确发送图像数据。

关于php - 显示图像时出错 - 从 PHP 和 MySQL 新手到 Ninja 的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47308774/

相关文章:

python - 如何消除光的偏转

c# - 有没有理由我不应该从 C# 开始

php - 我如何使用 phpunit 测试这个类?

mysql - MySQL 的 Connector/J 可以与 MariaDB 一起使用吗?

Mysql .NET 连接字符串错误

javascript - 使用 JavaScript 和 AJAX 从 HTML 输入标记检索图像并将其传递给 PHP 脚本以上传到数据库

javascript - img src 未连接到图像路径

javascript - php POST 插入 javascript

php - 获取本月的最后一天?

mysql - 怎么了。当我调用外键时