免责声明:据我所知,将图像存储在目录与数据库中是更好的方法,但请为了学习而幽默我。提前感谢您的帮助。
在将图像作为BLOB上传到我的数据库中并在用户登录时显示图像时,我遇到了问题。
我测试了多种上传方法,发现了以下内容:
在以下情况下旋转图像:
1)选择文件,然后单击移动设备上的“拍照”。
在以下情况下不会旋转图像:
1)选择文件,然后从移动设备单击“从图库”。
2)使用台式计算机拍摄并上载图像的屏幕截图。
3)使用iPhoto等应用程序导入图像,然后上传。
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");
?>
答案 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());
这会将您的图像资源写入可插入数据库的字符串。
如果您更改了应用程序,也很容易修改它以输出到文件系统而不是数据库。