我可以成功地將影像上傳到 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"/>';
}
?>
uj5u.com熱心網友回復:
請使用 fread(或 file_get_contents)獲取上傳的二進制資料并
請在使用 bind_param 時為二進制資料指定“b”(blob)
對于上傳圖形(肯定不會太小),使用 send_long_data()。
原因:
如果變數的資料大小超過最大值。允許的資料包大小(max_allowed_pa??cket),您必須在型別中指定 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>";
}
?>
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/474270.html
