-2

我正在阅读关于二进制数据的书中的一章。我想做的是在我的数据库处理个人资料时自动显示一个人的图片。

到目前为止,我的解决方案有效,照片是最后一块拼图。

本书将带您进入将文件名链接输出到屏幕的阶段,单击此链接会显示图片。

我想要做的是让图片自动显示,例如在 Facebook 上。在那里,您不会看到指向您的个人资料图片的链接,而是看到实际图片本身。

代码如下所示:

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';

PHOTO.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><?php htmlout($f['filedata']); ?></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>

感谢所有帮助。

当前照片的摘录.HTML

<?php foreach($files as $f): ?>
    <tr>
      <td>
        <a href="?action=view&amp;id=<?php htmlout($f['id']); ?>"
            ><?php htmlout($f['filename']); ?></a>

            <!-- attempt to output image not path -->
            <img src="<?php echo htmlout($f['filename']); ?>" />
      </td>

辅助功能

<?php

function html($text)
{
    return htmlspecialchars($text, ENT_QUOTES, 'UTF-8');
}

function htmlout($text)
{
    echo html($text);
}

?>
4

2 回答 2

2

将其包装在<img>标签中。这会将其输出为图像。

IE<img src="<?php echo $image; ?>">

于 2012-08-29T18:31:28.480 回答
1

在大多数情况下,通过将图像文件保存在通过 HTTP 公开可用的目录结构中的某个位置并将指向该图像位置的链接存储在数据库中,您会得到更好的服务。

因此,例如,当用户上传图像时,您将其放在您的 web 目录中的某个用户图像目录中,然后将图像的路径或 URL 存储在数据库中的 varchar 字段中。

这给您带来的好处是可以减小数据库大小,使您从数据库中查询图片信息的速度更快,改进浏览器对图像的缓存,并允许您将静态文件保存在一个地方(可能再次保存在 CDN 上)在最终用户的浏览器中具有更好的性能)。

于 2012-08-29T18:32:55.553 回答