图像上传但不显示 PHP

  • 本文关键字:显示 PHP 图像 php html
  • 更新时间 :
  • 英文 :


我可以成功地将图像上传到MySQL,但当试图从MySQL显示图像时,它们似乎坏了。

$image = $_FILES['image']['tmp_name'];
$sql = "INSERT INTO images (image,id) VALUES(?,?)";
$statement = $conn->prepare($sql);
$statement->bind_param('si', $image, $id);
$statement->execute();

$check = mysqli_stmt_affected_rows($statement);
if($check == 1){
$msg = 'Image was uploaded';
}else{
$msg = 'Something went wrong!';
}
}
?>
<form action="" method="post" enctype="multipart/form-data">
<input type="file" name="image" />
<button>Upload</button>
</form>
<?php
echo $msg;
?>
<?php
$sql = "SELECT image_id, image, id FROM images WHERE id = ?";
$statement = $conn->prepare($sql);
$statement->bind_param('i', $id);
$statement->execute();
$result = $statement->get_result();
foreach($result as $row){
echo '<img src="data:image/jpg;base64,'.base64_encode($row['image'] ).'" height="200" width="200"/>';
}

不知道我做错了什么,任何帮助将非常感激。只是玩玩这类东西,而不是生产产品,否则我就把表单从代码中拿开了。

编辑!数据库截图

所以我编辑我的代码建议…现在图像没有保存为blob, blob部分是空的,这是一个问题。

$msg = '';
$id = $_SESSION['id'];
if($_SERVER['REQUEST_METHOD'] == 'POST')
{
$tmpName = $_FILES['image']['tmp_name'];
// Read the file 
$fp      = fopen($tmpName, 'r');
$image = fread($fp, filesize($tmpName));
fclose($fp);
$sql = "INSERT INTO images (image,id) VALUES(?,?)";
$statement = $conn->prepare($sql);
$statement->bind_param('bi', $image, $id);
$statement->execute();

$check = mysqli_stmt_affected_rows($statement);
if($check == 1){
$msg = 'Image was uploaded';
}else{
$msg = 'Something went wrong!';
}
}
?>
<form action="" method="post" enctype="multipart/form-data">
<input type="file" name="image" />
<button>Upload</button>
</form>
<?php
echo $msg;
?>
<?php
$sql = "SELECT image_id, image, id FROM images WHERE id = ?";
$statement = $conn->prepare($sql);
$statement->bind_param('i', $id);
$statement->execute();
$result = $statement->get_result();
foreach($result as $row){
echo '<img src="data:image/jpg;base64,'.base64_encode($row['image'] ).'" height="200" width="200"/>';
}
?>
  1. 请使用fread(或file_get_contents)获取上传的二进制数据

  2. 请指定"b"当使用bind_param

    时,(blob)表示二进制数据
  3. 对于上传图形(肯定不会太小),使用send_long_data()。

原因:

如果变量的数据大小超过max。允许的数据包大小(max_allowed_packet),您必须在types中指定b,并使用mysqli_stmt_send_long_data()以数据包的形式发送数据。

以上摘自以下官方文件:https://www.php.net/manual/zh/mysqli-stmt.bind-param.php

因此改变

$image = $_FILES['image']['tmp_name'];
$sql = "INSERT INTO images (image,id) VALUES(?,?)";
$statement = $conn->prepare($sql);
$statement->bind_param('si', $image, $id);
$statement->execute();

$tmpName = $_FILES['image']['tmp_name'];
// Read the file 
$fp      = fopen($tmpName, 'r');
$image = fread($fp, filesize($tmpName));
fclose($fp);
// alternative method
//$image = file_get_contents($tmpName); 
$sql = "INSERT INTO images (image,id) VALUES(?,?)";
$statement = $conn->prepare($sql);

$null = NULL; 
$statement->bind_param('bi', $null, $id);
$statement->send_long_data(0, $image); 
$statement->execute();

注意:

$null变量是必需的,因为bind_param()总是需要给定参数的变量引用。在这种情况下"b"(如blob)参数。所以$null只是一个假的,以使语法工作。

在下一步中,我们需要"填充"带有实际数据的blob参数。这是通过send_long_data()完成的。此方法的第一个参数指示要将数据与哪个参数关联。参数从0开始编号。send_long_data()的第二个参数包含要存储的实际数据。

因此,对于您的情况,您可以使用以下示例代码(经过测试- 100%工作)):
<?php
session_start();
$servername = "localhost";
$username = "xxxxxx";
$password = "xxxxxxxxxxxx";
$dbname = "xxxxxxx";
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
$msg = '';
$id = $_SESSION['id'];
$id=1234;  // I set this value for testing
if($_SERVER['REQUEST_METHOD'] == 'POST')
{
$tmpName = $_FILES['image']['tmp_name'];
// Read the file 
$fp      = fopen($tmpName, 'r');
$image = fread($fp, filesize($tmpName));
fclose($fp);

$sql = "INSERT INTO images (image,id) VALUES(?,?)";
$statement = $conn->prepare($sql);

$null = NULL; 
$statement->bind_param('bi', $null, $id);
$statement->send_long_data(0, $image); 
$statement->execute();

$check = mysqli_stmt_affected_rows($statement);
if($check == 1){
$msg = 'Image was uploaded';
}else{
$msg = 'Something went wrong!';
}
}
?>
<form action="#" method="post" enctype="multipart/form-data">
<input type="file" name="image" />
<button>Upload</button>
</form>
<?php
echo $msg;
?>
<?php
$sql = "SELECT image_id, image, id FROM images WHERE id = ?";
$statement = $conn->prepare($sql);
$statement->bind_param('i', $id);
$statement->execute();
$result = $statement->get_result();
foreach($result as $row){
echo '<img src="data:image/jpg;base64,'.base64_encode($row['image']).'" height="200" width="200"/>';
echo "<br>";
}
?>

最新更新