显示个人资料照片,而不是指向该照片的链接


Displaying a profile photo rather then a link to that photo

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

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

这本书会把文件名链接输出到屏幕上,点击这个链接就会显示图片。

我想做的不是这样,而是让图片自动显示,比如在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);
}
?>

将其包装在<img>标记中。这将把它作为图像输出。

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

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

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

这使您可以降低数据库大小,使您从数据库中查询图片信息的速度更快,改善图像的浏览器缓存,并允许您将静态文件保存在一个位置(可能再次在CDN上,以便在最终用户的浏览器中获得更好的性能)。