Php 上传并在MySQL中存储图像
我试图上传和存储一个MySQL内的图像,由于某种原因,我得到了一个坏照片时,照片提交。我认为$image=$image->fetch_object()有问题;此外,当我单击损坏的照片时,我会收到以下错误消息:致命错误:对非对象调用成员函数fetch_object()。有没有解决此问题的建议Php 上传并在MySQL中存储图像,php,html,mysqli,Php,Html,Mysqli,我试图上传和存储一个MySQL内的图像,由于某种原因,我得到了一个坏照片时,照片提交。我认为$image=$image->fetch_object()有问题;此外,当我单击损坏的照片时,我会收到以下错误消息:致命错误:对非对象调用成员函数fetch_object()。有没有解决此问题的建议 <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Upload an Image</title>
</head>
<body>
<form action="index.php" method="POST" enctype="multipart/form-data">
File:
<input type="file" name='image'/> <input type="submit" value="submit">
</form>
<?php
//connect to database
try{
$db = new mysqli('','','','');
}catch(Exception $e){
echo $e->getMessage();
}
if(isset($_FILES['image'])){
$file = $_FILES['image']['tmp_name'];//['tmp_name'] is the temporary location
}
if(!isset($file)){
echo 'please select an image';
}else{
$image = base64_encode(file_get_contents($_FILES['image']['tmp_name']));
$image_name = $_FILES['image']['name'];
$image_size = getimagesize($_FILES['image']['tmp_name']);
if($image_size == false){
echo 'thats not an image';
}else{
$insert = $db->prepare("INSERT INTO store VALUES (?, ?, ?)");
$insert->bind_param('bsi', $image, $image_name, $image_size);
if(!$insert->execute()){
echo "Problem uploading file";
}else{
printf("%d Row inserted.\n", $insert->affected_rows);
echo $lastid = $db->insert_id;//returns the last id that was inserted
echo 'image uploaded.<p/> Your Image:<p/><img src=get.php?id=$lastid>';
}
}
}
?>
</body>
</html>
对不起,我没有抓住要点 以下代码无法工作: 不会计算第一条语句中的$id,因为它是单引号中的字符串 损坏图像的原因可能是使用addslashes()来屏蔽输入,这是二进制数据。我将使用带有参数的预处理语句并绑定输入数据
旧答案 PHP手册上说(): 默认情况下,文件将存储在服务器的默认临时文件夹中 目录,除非已使用 php.ini中的upload_tmp_dir指令 [……] 无论逻辑如何,您都应该从 临时目录或将其移动到其他位置 [……]
在使用上载的文件之前,应使用移动该文件。我也不主张在数据库中存储图像…对不起,我没有抓住要点 以下代码无法工作: 不会计算第一条语句中的$id,因为它是单引号中的字符串 损坏图像的原因可能是使用addslashes()来屏蔽输入,这是二进制数据。我将使用带有参数的预处理语句并绑定输入数据
旧答案 PHP手册上说(): 默认情况下,文件将存储在服务器的默认临时文件夹中 目录,除非已使用 php.ini中的upload_tmp_dir指令 [……] 无论逻辑如何,您都应该从 临时目录或将其移动到其他位置 [……] 在使用上载的文件之前,应使用移动该文件。我也不主张在数据库中存储图像…您的保存脚本:
if(!$_FILES['image']['tmp_name']){
$image = base64_encode(file_get_contents($_FILES['image']['tmp_name']));
$image_name = addslashes($_FILES['image']['name']);
$image_size = getimagesize($_FILES['image']['tmp_name']);
if(!$insert = $db->query("INSERT INTO store (name,image) VALUES('{$image_name}','{$image}')")){
echo "Problem uploading file";
}else{
echo $lastid = $db->insert_id;//returns the last id that was inserted
echo 'image uploaded.<p/> Your Image:<p/><img src='data:image/png;base64,<?=$image;?>';
}
}
if(!$\u文件['image']['tmp\u名称'])){
$image=base64_编码(文件获取内容($_文件['image']['tmp_名称]]);
$image\u name=addslashes($\u文件['image']['name']);
$image\u size=getimagesize($\u文件['image']['tmp\u名称]]);
if(!$insert=$db->query(“插入到存储(名称、图像)值(“{$image\u name}”、“{$image}”)中”){
echo“上传文件时出现问题”;
}否则{
echo$lastid=$db->insert_id;//返回插入的最后一个id
echo“上传图像。您的图像:”;
}
}
这样,当您需要图像时,只需从数据库中获取数据uri并重新使用即可。您的保存脚本:
if(!$_FILES['image']['tmp_name']){
$image = base64_encode(file_get_contents($_FILES['image']['tmp_name']));
$image_name = addslashes($_FILES['image']['name']);
$image_size = getimagesize($_FILES['image']['tmp_name']);
if(!$insert = $db->query("INSERT INTO store (name,image) VALUES('{$image_name}','{$image}')")){
echo "Problem uploading file";
}else{
echo $lastid = $db->insert_id;//returns the last id that was inserted
echo 'image uploaded.<p/> Your Image:<p/><img src='data:image/png;base64,<?=$image;?>';
}
}
if(!$\u文件['image']['tmp\u名称'])){
$image=base64_编码(文件获取内容($_文件['image']['tmp_名称]]);
$image\u name=addslashes($\u文件['image']['name']);
$image\u size=getimagesize($\u文件['image']['tmp\u名称]]);
if(!$insert=$db->query(“插入到存储(名称、图像)值(“{$image\u name}”、“{$image}”)中”){
echo“上传文件时出现问题”;
}否则{
echo$lastid=$db->insert_id;//返回插入的最后一个id
echo“上传图像。您的图像:”;
}
}
这样,当您需要图像时,您可以从数据库中获取数据uri并重新使用它。问题在于HTML,您必须首先了解HTML,将图像存储在mysql中不是一种糟糕的做法吗?如果我必须这样做,我会将图像的数据uri存储在数据库中,而不是来自文件内容的数据。我知道这不好,但我只是在测试@wackywalrust。问题是HTML,你必须先了解,在mysql中存储图像不是不好的做法吗?如果必须这样做,我会将图像的数据uri存储在数据库中,而不是文件内容中的数据。我知道这很糟糕,但我只是在测试@WackyWalrusI完全同意这一点,但他说他正在测试如何在数据库中保存图像。就我个人而言,我总是将文件移动到服务器上的某个位置。不需要将所有的图像数据都放在数据库中。我用带有参数的prepared语句更新了代码,并绑定了输入数据,现在我没有得到错误,但仍然有一个错误image@KarishKarish您应该能够对脚本的保存部分使用相同的绑定机制。但这还不是全部。上传后,您必须检查图像的类型,以便在请求图像时设置正确的标题。这些图像从来都不是jpeg。@VMai目前我正在上载jpeg文件,所以这不应该是问题所在,您保存这些图像是什么意思script@KarishKarish您已经习惯于转义二进制数据。正如我所说,这可能还不够。请重写保存部分,使其也使用绑定机制。它确保您从数据库中的图像中准确地获取原始数据。损坏的数据不容易修复。最好扔掉所有损坏的图像。我完全同意这一点,但他说他正在测试如何将图像保存到数据库中。就我个人而言,我总是将文件移动到服务器上的某个位置。不需要将所有的图像数据都放在数据库中。我用带有参数的prepared语句更新了代码,并绑定了输入数据,现在我没有得到错误,但仍然有一个错误image@KarishKarish您应该能够对脚本的保存部分使用相同的绑定机制。但这还不是全部。上传后,您必须检查图像的类型,以便在请求图像时设置正确的标题。这些图像从来都不是jpeg。@VMai目前我正在上载jpeg文件,所以这不应该是问题所在,您保存这些图像是什么意思script@KarishKarish您已经习惯于转义二进制数据。正如我所说,这可能还不够。请重写保存部分,使其也使用绑定机制。它可以确保您从图像中准确获取原始数据
if(!$_FILES['image']['tmp_name']){
$image = base64_encode(file_get_contents($_FILES['image']['tmp_name']));
$image_name = addslashes($_FILES['image']['name']);
$image_size = getimagesize($_FILES['image']['tmp_name']);
if(!$insert = $db->query("INSERT INTO store (name,image) VALUES('{$image_name}','{$image}')")){
echo "Problem uploading file";
}else{
echo $lastid = $db->insert_id;//returns the last id that was inserted
echo 'image uploaded.<p/> Your Image:<p/><img src='data:image/png;base64,<?=$image;?>';
}
}