PHP - 从手机

时间:2015-07-01 18:56:35

标签: php mysql image blob exif

免责声明:据我所知,将图像存储在目录与数据库中是更好的方法,但请为了学习而幽默我。提前感谢您的帮助。

在将图像作为BLOB上传到我的数据库中并在用户登录时显示图像时,我遇到了问题。

我测试了多种上传方法,发现了以下内容:

在以下情况下旋转图像:
1)选择文件,然后单击移动设备上的“拍照”。

Rotated Image

在以下情况下不会旋转图像:
1)选择文件,然后从移动设备单击“从图库”。
2)使用台式计算机拍摄并上载图像的屏幕截图。
3)使用iPhoto等应用程序导入图像,然后上传。

Not Rotated Image

upload.php - 将图片上传到数据库。

<?php

require_once "../config/config.php";
session_start();

if(empty($_SESSION['id'])) {
  header("Location: ../login/login.html");
} else {
  $id = $_SESSION['id'];
}

include "fetchavatar.php";

if(!empty($_FILES['avatar']['name']) && (isset($_POST['upload']))) {
  $name = $_FILES['avatar']['name'];
  $temp = $_FILES['avatar']['tmp_name'];
  $size = $_FILES['avatar']['size'];
  $type = $_FILES['avatar']['type'];

  $fp = fopen($temp, 'r');
  $img = fread($fp, filesize($temp));
  fclose($fp);

  if($fetchedrows) {
    $stmt = $con->prepare("UPDATE avatars SET name = ?, type = ?, size = ?, data = ? WHERE user_id = ?;");
  } else {
    $stmt = $con->prepare("INSERT into avatars (name, type, size, data, user_id) VALUES(?, ?, ?, ?, ?);");
  }

    $stmt->bindParam(1, $name);
    $stmt->bindParam(2, $type);
    $stmt->bindParam(3, $size);
    $stmt->bindParam(4, $img);
    $stmt->bindParam(5, $id);
    $stmt->execute();

}

header("Location: profile.php");

?>

fetchavatar.php - 从数据库中选择图片,将HTML +图片存储到$ avatar。

<?php

require_once "../config/config.php";
session_start();

$id = $_SESSION['id'];

$stmt = $con->prepare("SELECT * FROM avatars WHERE user_id = ?");
$stmt->bindParam(1, $id);
$stmt->execute();
$result = $stmt->fetch(PDO::FETCH_ASSOC);

$fetchedrows = $stmt->rowCount();

$_SESSION['avatar'] = base64_encode($result['data']);
$avatar = "<img src='data:image/jpeg;base64,". $_SESSION['avatar']. "' width='100' height='100'>";

?>

profile.php - 个人资料页面。

<?php

session_start();
include "fetchavatar.php";

?>

<html>
<body>
 <div id="profile_div">
 <h1>Profile Page</h1>

  <?php echo $avatar ?>

  ...

</body>
</html>

以下是我最近尝试旋转图像的示例。尝试此方法时,上载的BLOB数据为空白,不再显示图像。我已经尝试过这里提供的多种解决方案,但是在正确实现代码或者知道我是否在正确的轨道上都没有成功。

upload.php的

<?php

...

include "fetchavatar.php";

if(!empty($_FILES['avatar']['name']) && (isset($_POST['upload']))) {
  $name = $_FILES['avatar']['name'];
  $temp = $_FILES['avatar']['tmp_name'];
  $size = $_FILES['avatar']['size'];
  $type = $_FILES['avatar']['type'];


  $image = imagecreatefromstring(file_get_contents($temp));
  $exif = exif_read_data($temp);
  if(!empty($exif['Orientation'])) {
    switch($exif['Orientation']) {
        case 8:
            $image = imagerotate($image,90,0);
            break;
        case 3:
            $image = imagerotate($image,180,0);
            break;
        case 6:
            $image = imagerotate($image,-90,0);
            break;
     }
  }

  $fp = fopen($image, 'r');
  $img = fread($fp, filesize($image));
  fclose($fp);

  if($fetchedrows) {
    $stmt = $con->prepare("UPDATE avatars SET name = ?, type = ?, size = ?, data = ? WHERE user_id = ?;");
  } else {
    $stmt = $con->prepare("INSERT into avatars (name, type, size, data, user_id) VALUES(?, ?, ?, ?, ?);");
  }

    $stmt->bindParam(1, $name);
    $stmt->bindParam(2, $type);
    $stmt->bindParam(3, $size);
    $stmt->bindParam(4, $img);
    $stmt->bindParam(5, $id);
    $stmt->execute();

}

header("Location: profile.php");

?>

1 个答案:

答案 0 :(得分:0)

在上一个upload.php示例中,您似乎尝试fopen()图像资源而不是文件系统上的图像文件。尝试更改

$fp = fopen($image, 'r');
$img = fread($fp, filesize($image));
fclose($fp);

ob_start();
imagejpeg($image);
$img = addslashes(ob_get_clean());

这会将您的图像资源写入可插入数据库的字符串。

如果您更改了应用程序,也很容易修改它以输出到文件系统而不是数据库。