View Full Version : [Ajuda] Upload de Imagem em PHP para MYSQL (Base de Dados)


Majin Vegeta
05-04-2008, 12:32
boas, alguem me pode dar umas dicas sobre como fazer um upload de uma imagem atraves de codigo PHP para a base de dados (Mysql). e que estou farto de procurar na net e encontrei varios codigos a funcionar mas o upload nao e feito para a base de dados por isso e que precisava da vossa ajuda.
espero que me puderem ajudar

cumps

P2mb2
05-04-2008, 13:18
Um artigo sobre...

Aim of this article is to sho you the simples way to uplaod images to mySQL database. First you need to create a custom database table. The name of this table can be named as "images_table". Now here is the SQL code for creating the table.

images_table.sql

CREATE TABLE `images_table` (
`imageID` int(11) NOT NULL auto_increment,
`imageName` varchar(25) NOT NULL default '',
`imageFile` longtext NOT NULL,
PRIMARY KEY (`imageID`)
) AUTO_INCREMENT=1 ;

This is our upload HTML file. There will be no server-side coding on this file :

imageupload.php

<html>
<head>
<title>Upload Image</title>
</head>
<body>
<form action="imageupload.php" method="POST" enctype="multipart/form-data">
Name : <input type="text" name="imageName"> <br/>
Image :<input type="file" name="imageFile">
<input type="submit" value="Upload" name="func">
</form>
</body>
</html>


Now this is the rest of the code. This php file will insert the image to our database.

imageupload.php

<?

/*
This function take the image from form variables
*/

function getImageFile($file){
$takeFile = fopen($file, "r");
$file = fread($takeFile, filesize($file));
fclose($takeFile);

return $file;
}

/*
We learn image type using this function
Because we will let onlt gif, jpg and png images can be uploaded
*/

function getfileType( $name ){
$name = explode(".", $name);
$name = array_reverse($name);
$name = $name[0];
return $name;
}

$allowedImageTypes = array("gif","jpg","png");
if(empty($_FILES['image_file']['tmp_name'])){
echo "File not uploaded";
}
else {
$fileType = $_FILES['image_file']['name'];

if(in_array(getfileType($fileType), $allowedImageTypes)){
$fileContent = getImageFile($_FILES['imgFile']['tmp_name']);

$uploadedImage = chunk_split(base64_encode($fileContent));

$query = "INSERT INTO images_table VALUES('NULL','$imgName','$uploadedImage')";

$result = mysql_query($query);

if(mysql_affected_rows() > 0){

echo "Image has been inserted succesfully";
}
else {
echo "Image can not be inserted check your submission";
}
}
else {
echo "This is not a true image type";
}
}

Majin Vegeta
05-04-2008, 21:16
p2mb2 ja tive a ver o codigo que me arranjaste mas nao o consigo por a funcionar.
e que tipo nao me da erro nenhum a nivel de codigo mas quando vou executo a pagina(meti tudo na mesma pagina) aparece as janelas de input e isso mas tambem aparece isto "file not uploaded" o que penso que normal porque no codigo tem la cenas que manda verificar se os campso tao vazios e, se estiverem, para aparecer essa mensagem. no entanto, quanto carrego no botao upload da sempre "file not uploaded" e eu nao sei porque. espero que me possas ajudar.

cumps

P.S. acrescentei tambem estas linahs de codigo
$ligax=mysqli_connect('localhost','root');
if(!$ligax){
echo '<p> Falha na ligação.'; exit;
}
mysqli_select_db($ligax,'nomedabasededados');

nao sei se sao precisas ou nao mas seja como for (com ou sem estas linhas de codigo)da na mesma o erro k disse acima

K0mA
05-04-2008, 21:23
Boas,

P2mb2 (http://www.techzonept.com/member.php?u=66959) quando for assim convém meteres a fonte (http://www.dotnetindex.com/articles/3120_How_to_upload_images_to_mySQL_within_PHP.asp) por respeito aos direitos de autor, e também para se saber de onde veio e onde eventualmente procurar mais informação.

Neste caso conhecendo a fonte (http://www.dotnetindex.com/articles/3120_How_to_upload_images_to_mySQL_within_PHP.asp) é possível verificar que um comentário a esse código diz o seguinte:


by techker 3/3/2008
it's not working for me at all??
file not uploaded or blank ?
what version of sql /php is this?


Majin Vegeta (http://www.techzonept.com/member.php?u=99127) tenta safar-te por aqui (http://www.google.pt/search?hl=pt-PT&q=upload+images+to+mySQL+PHP&meta=).

Cumprimentos

Majin Vegeta
05-04-2008, 22:05
K0mA, eu com ajuda do link k tu me deste arranjei este codigo:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html>
<head><title>File Upload To Database</title></head>
<body>
<h3>Please Choose a File and click Submit</h3>

<form enctype="multipart/form-data" action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
<input type="hidden" name="MAX_FILE_SIZE" value="10000000" />
<input name="userfile[]" type="file" />
<input type="submit" value="Submit" />
</form>
</body>
</html>

<?php
// check if a file was submitted
if(!isset($_FILES['userfile'])) {
echo '<p>Please select a file</p>';
}
else
{
try {
upload();
// give praise and thanks to the php gods
echo '<p>Thank you for submitting</p>';
}
catch(Exception $e) {
echo $e->getMessage();
echo 'Sorry, could not upload file';
}
}

// the upload function
function upload(){

if(is_uploaded_file($_FILES['userfile']['tmp_name'])) {

// check the file is less than the maximum file size
if($_FILES['userfile']['size'] < $maxsize)
{
// prepare the image for insertion
$imgData =addslashes (file_get_contents($_FILES['userfile']['tmp_name']));
// $imgData = addslashes($_FILES['userfile']);

// get the image info..
$size = getimagesize($_FILES['userfile']['tmp_name']);

// put the image in the db...
// database connection
mysqli_connect('localhost','root');


// select the db
mysqli_select_db($ligax,diagonalley);

// our sql query
$sql = "INSERT INTO testblob
(image_id,image_type,image,image_size,image_name)
VALUES
('','{$size['mime']}','{$imgData}','{$size[3]}','{$_FILES['userfile']['name']}')";

// insert the image
if(!mysql_query($sql)) {
echo 'Unable to upload file';
}
}
}
else {
// if the file is not less than the maximum allowed, print an error
echo
'<div>File exceeds the Maximum File limit</div>
<div>Maximum File limit is '.$maxsize.'</div>
<div>File '.$_FILES['userfile']['name'].' is '.$_FILES['userfile']['size'].' bytes</div>
<hr />';
}
}
// echo $sql;
?>



no entanto, da-me erro sempre que tenot fazer o uplaod de uma imagem porque diz sempre que a imagem e demasiado grande e eu ja experimentei com iamgens pequeninissimas e dam na mesma erro e eu nao tou a ver qual e o erro, e nao sei e se e preciso acrescentar a ligação a base de dados.

cumps

Kayvlim
05-04-2008, 22:41
Dá uma vista de olhos a estes tópicos:

http://www.techzonept.com/showthread.php?t=258570
http://www.techzonept.com/showthread.php?t=252886

e esta página pode dar mais jeito:
http://www.phpriot.com/articles/images-in-mysql/3

AliFromCairo
05-04-2008, 23:01
Boas, o tipo de dados que estás a utilizar para guardar a imagem não deve ser o mais adequado. Dá uma vista de olhos nos links do post anterior.

Majin Vegeta
06-04-2008, 13:17
boas, se repararem o codigo k eu tinha postado acima e baseado nos primeiros passos deste link que postaram (http://www.phpriot.com/articles/images-in-mysql/7).
eu tive a observar o codigo com mais atençao e penso que o probelma ta na variavel ($maxsize).
isto porque quando eu faço o upload aparecem esta mensagem:



"File exceeds the Maximum File limit
Maximum File limit is
File Array is Array bytes".

se repararem no codigo esta esta linha: <div>Maximum File limit is '.$maxsize.'</div>
ou seja, ele nao ta a trazer a variavel do maxsize logo penso que e por isso que ta a dar erro mas memso assim nao sei como o resolver.

o que e voces acham?

cumps

Kayvlim
06-04-2008, 17:11
Não vejo a definição de $maxsize.
Mostra o código todo que tens actualmente, sff.

Majin Vegeta
06-04-2008, 19:59
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html>
<head><title>File Upload To Database</title></head>
<body>
<h3>Please Choose a File and click Submit</h3>

<form enctype="multipart/form-data" action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
<input type="hidden" name="MAX_FILE_SIZE" value="10000000" />
<input name="userfile[]" type="file" />
<input type="submit" value="Submit" />
</form>
</body>
</html>

<?php
// check if a file was submitted
if(!isset($_FILES['userfile'])) {
echo '<p>Please select a file</p>';
}
else
{
try {
upload();
// give praise and thanks to the php gods
echo '<p>Thank you for submitting</p>';
}
catch(Exception $e) {
echo $e->getMessage();
echo 'Sorry, could not upload file';
}
}

// the upload function
function upload(){

if(is_uploaded_file($_FILES['userfile']['tmp_name'])) {

// check the file is less than the maximum file size
if($_FILES['userfile']['size'] < $maxsize)
{
// prepare the image for insertion
$imgData =addslashes (file_get_contents($_FILES['userfile']['tmp_name']));
// $imgData = addslashes($_FILES['userfile']);

// get the image info..
$size = getimagesize($_FILES['userfile']['tmp_name']);

// put the image in the db...
// database connection
mysqli_connect('localhost','root');


// select the db
mysqli_select_db($ligax,diagonalley);

// our sql query
$sql = "INSERT INTO testblob
(image_id,image_type,image,image_size,image_name)
VALUES
('','{$size['mime']}','{$imgData}','{$size[3]}','{$_FILES['userfile']['name']}')";

// insert the image
if(!mysql_query($sql)) {
echo 'Unable to upload file';
}
}
}
else {
// if the file is not less than the maximum allowed, print an error
echo
'<div>File exceeds the Maximum File limit</div>
<div>Maximum File limit is '.$maxsize.'</div>
<div>File '.$_FILES['userfile']['name'].' is '.$_FILES['userfile']['size'].' bytes</div>
<hr />';
}
}
// echo $sql;
?>

e este + a cena da tabela da base de dados

cumps

Kayvlim
06-04-2008, 20:11
Devias usar as tags CODE, ou, neste caso, PHP. Fiz o report a dizer "CODE" mas devia ter dito "PHP". My bad :P

Experimenta assim:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html>
<head><title>File Upload To Database</title></head>
<body>
<h3>Please Choose a File and click Submit</h3>

<form enctype="multipart/form-data" action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
<input type="hidden" name="MAX_FILE_SIZE" value="10000000" />
<input name="userfile[]" type="file" />
<input type="submit" value="Submit" />
</form>
</body>
</html>

<?php
// check if a file was submitted
if(!isset($_FILES['userfile'])) {
echo '<p>Please select a file</p>';
}
else
{
try {
$maxsize = $_POST["MAX_FILE_SIZE"]; // <<<<<<<<<<<<<
upload();
// give praise and thanks to the php gods
echo '<p>Thank you for submitting</p>';
}
catch(Exception $e) {
echo $e->getMessage();
echo 'Sorry, could not upload file';
}
}

// the upload function
function upload(){

if(is_uploaded_file($_FILES['userfile']['tmp_name'])) {

// check the file is less than the maximum file size
if($_FILES['userfile']['size'] < $maxsize)
{
// prepare the image for insertion
$imgData =addslashes (file_get_contents($_FILES['userfile']['tmp_name']));
// $imgData = addslashes($_FILES['userfile']);

// get the image info..
$size = getimagesize($_FILES['userfile']['tmp_name']);

// put the image in the db...
// database connection
mysqli_connect('localhost','root');


// select the db
mysqli_select_db($ligax,diagonalley);

// our sql query
$sql = "INSERT INTO testblob
(image_id,image_type,image,image_size,image_name)
VALUES
('','{$size['mime']}','{$imgData}','{$size[3]}','{$_FILES['userfile']['name']}')";

// insert the image
if(!mysql_query($sql)) {
echo 'Unable to upload file';
}
}
}
else {
// if the file is not less than the maximum allowed, print an error
echo
'<div>File exceeds the Maximum File limit</div>
<div>Maximum File limit is '.$maxsize.'</div>
<div>File '.$_FILES['userfile']['name'].' is '.$_FILES['userfile']['size'].' bytes</div>
<hr />';
}
}
// echo $sql;
?>

Não conheço a função upload() e ela não está declarada aí e não tens includes. Não existe no site do PHP. Explica-me o que é que essa função faz, sff. Não andas a copiar coisas dos sites que te têm dado sem as perceber, pois não?

Majin Vegeta
06-04-2008, 20:58
tipo, o codigo que me arrnajaste continua a nao dar.
em relação a function é o seguinte. eu percebo alguma coisa de php e mas nao muito alias, foi por isso que vim pedir ajuda. agora, eu nao chapei o codigo sem perceber o que tava a fazer no entanto, nunca tinha usado uma function no php mas nao a tirei porque segundo o site onde andei a ver este codigo, pelo que o meu ingles e capaz de perceber penso que ela verifica o tamanho da imagem e essas cenas, ou seja, os ifs . (podes conferir aqui http://www.phpriot.com/articles/images-in-mysql/7)

cumps

Kayvlim
06-04-2008, 21:05
Pois... o link que me deste tem PRECISAMENTE a declaração da função upload(). Precisas de ter isso tudo no teu código ;)
Não podes mesmo "chapar" código. Precisas frequentemente de fazer modificações, e no conteúdo dessa função também tens algumas coisas para mudar. Deixo para ti o trabalho de o fazer :P

Majin Vegeta
06-04-2008, 22:13
podes m ou menos dar umas dicas do que tenho de mudar?

cumps

Kayvlim
06-04-2008, 23:25
Sinceramente, agora que vejo com mais calma os códigos, tens aí muita coisa misturada :wvsore:

O que tens de modificar? Basicamente, as informações do MySQL e o $maxsize, mas precisas do MaxSize como global se ele estiver a ser declarado fora da função. No entanto, dado o código que tens, parece que parte do teu código veio dali. Logo, essa parte devia estar dentro da função.
Não te sei explicar melhor. Mas acho que vai muita confusão por aí.

Majin Vegeta
09-04-2008, 10:44
tipo, ele agora ja me traz a variavel do maxzise porque eu coloquei-a dentro da função.

function upload(){

$maxsize = $_POST["MAX_FILE_SIZE"];

if(is_uploaded_file($_FILES['userfile']['tmp_name'])) {

// check the file is less than the maximum file size
if($_FILES['userfile']['size'] < $maxsize)
{
// prepare the image for insertion
$imgData =addslashes (file_get_contents($_FILES['userfile']['tmp_name']));
// $imgData = addslashes($_FILES['userfile']);

// get the image info..
$size = getimagesize($_FILES['userfile']['tmp_name']);

// put the image in the db...
// database connection
mysqli_connect('localhost','root');


// select the db
mysqli_select_db($ligax,diagonalley);

// our sql query
$sql = "INSERT INTO testblob
(image_id,image_type,image,image_size,image_name)
VALUES
('','{$size['mime']}','{$imgData}','{$size[3]}','{$_FILES['userfile']['name']}')";

// insert the image
if(!mysql_query($sql)) {
echo 'Unable to upload file';
}
}
}
else {
// if the file is not less than the maximum allowed, print an error
echo
'<div>File exceeds the Maximum File limit</div>
<div>Maximum File limit is '.$maxsize.'</div>
<div>File '.$_FILES['userfile']['name'].' is '.$_FILES['userfile']['size'].' bytes</div>
<hr />';
}
}
// echo $sql;
?>

no entanto, ele continua a dar erro porque dix que a imagem e muito grande
aparece o seguinte:
File exceeds the Maximum File limit
Maximum File limit is 10000000 (ele antes aparecia aqui $maxsize)

File Array is Array bytes

so que agora eu ja tive a ver o codigo varias vezes e nao sei o que hei-de alterar porque como nao me da erro nenhum a nivel de codigo ainda se torna mais dificil detectar o que esta mal.

cumps

Majin Vegeta
11-04-2008, 12:12
quando eu clico em submit como ja disse aparecem varias frases entre as quais esta
"File Array is Array bites"

nao percebo pk e que ele me esta a trazer a palavra array nesta linah de codigo (<div>File '.$_FILES['userfile']['name'].' is '.$_FILES['userfile']['size'].' bytes</div>) quando devia trazer o nome do ficheiro :(

como e que eu posso mudar isso e implementar dentro da função upload uma variavel que me guarde o nome e o tamanho do ficheiro?

pareceme que e isso que falta

help please

cumps

Kayvlim
11-04-2008, 21:33
Não sei o que se passa.
Faz

echo "<pre>";
print_r($_FILES);
echo "</pre>";

para vermos o que está a sair aí ;)

Majin Vegeta
12-04-2008, 20:46
angelofwisdow, antes aparecia o seguinte quando carregava em upload:

File exceeds the Maximum File limit
Maximum File limit is 10000000
File Array is Array bytes

Thank you for submitting

agora acrescentei mais aqueles echos que tu dissest e aparecem o seguinte:

File exceeds the Maximum File limit
Maximum File limit is 10000000
File Array is Array bytes
Array
(
[userfile] => Array
(
[name] => Array
(
[0] => 21454.jpg
)

[type] => Array
(
[0] => image/jpeg
)

[tmp_name] => Array
(
[0] => C:\Programas\xampp\tmp\php39.tmp
)

[error] => Array
(
[0] => 0
)

[size] => Array
(
[0] => 5254
)

)

)
Thank you for submitting



cumps

Majin Vegeta
15-04-2008, 17:12
para mim o erro ta ao inserir na base de dados:

a tabela da imagem que eu tenho e esta:
create table testblob (
image_id tinyint(3) not null default '0',
image_type varchar(25) not null default '',
image blob not null,
image_size varchar(25) not null default '',
image_ctgy varchar(25) not null default '',
image_name varchar(50) not null default ''
);




e o erro deve estar ao inserir os dados na base de dados ou seja aqui:

$sql = "INSERT INTO testblob
(image_id,image_type,image,image_size,image_name)
VALUES
('','{$size['mime']}','{$imgData}','{$size[3]}','{$_FILES['userfile']['name']}')";
$result=mysqli_query($ligax,$sql);



pq aquilo da erro da imagem ser mt grande porque o codigo tem:
// insert the image
if(!mysql_query($sql)) {
echo 'Unable to upload file';
}
}
}
else {
// if the file is not less than the maximum allowed, print an error
echo
'<div>File exceeds the Maximum File limit</div>
<div>Maximum File limit is '.$maxsize.'</div>
<div>File '.$_FILES['userfile']['name'].' is '.$_FILES['userfile']['size'].' bytes</div>
<hr />';
echo "<pre>";
print_r($_sql);
print_r($_FILES);
echo "</pre>";
}
}
// echo $sql;
?>

ou seja, segundo eu percebo ele da o erro do tamanho e isso tudo se nao conseguir inserir na base de dados (if(!mysql_query($sql)) porque senao nao deve dar nenhum erro mas mesmo que seja isso eu nao tou a conseguir resolver.



por favor ajudem-me que isto e mesmo importante.

cumps

Majin Vegeta
20-04-2008, 21:38
boas, ja consegui fazer o uplaod da imagem :)
nao foi com o codigo que tenho aui postado mas com outro que arranjei no entanto agora tenho outro problema :(
nao consigo "trazer" a imagem da base de dados. ou melhor eu arranjei um codigo que a tras mas ela so aparece qaundo faço uma hiperligação e o que eu queria era que ela aparecesse ao carregar a pagina.

eu sei que preciso disto:
mysql_connect("localhost", "root", "") or die(mysql_error());
mysql_select_db("nomedabasededados");

e sei que preciso de 2 variaveis. uma para fazer o select e outra para fazer o fetch_array ne?
e vou precisar de um header e finalmente dum print para aparecer a imagem.
so que ja andei a procurar codigo, a alterar e isso tudo so que tenho sempre problemas no header.

podem me ajudar?

cumps

Kayvlim
22-04-2008, 16:14
Mostra o código que tens para o envio, porque só sabendo como é enviado é que podemos saber como ir lá buscar.

Com o devido respeito, acho mesmo que precisas de aprender PHP antes de tentares fazer isso.
Os riscos de segurança de uma aplicação mal preparada são mesmo bastantes. Não tens noção. E se não perceberes o que estás a fazer, vais estar constantemente a pedir ajuda para te serem resolvidos problemas que podias resolver tu mesmo.

Majin Vegeta
25-04-2008, 13:04
ja resolvi o problema :)
obrigado a todos em especial a ti angelofwisdow :)

cumps

sarocas
17-06-2008, 00:43
Boas.
Atão e não gostarias de partilhar esse código ja resolvido?

Cumprimentos

Crypter
23-06-2008, 19:38
isso.. se puderes disponibiliza o codigo! pq eu fiz em php um album, e apesar de ter as funcoes todas a funcionar, ele nao faz o mais importante.. que é enviar a imagem para o MySQL, e se postass como resolvest ajudaria-me imenso!

sarocas
26-06-2008, 00:35
Poix...
O meu problema é mesmo visualiza-las depois de as ter na bd...

Cumps.

hostmake
26-06-2008, 00:42
sarocas, acho que já te ajudaram, eu inclusive fiz-te um código para isso noutro post, estou em erro :confused:

sarocas
26-06-2008, 14:38
Sim. Ajudas-te imenso...
Obrigado.
Fiz um pequeno programa onde faço upload e dps visualizo tudo mt bem.
Dps fui colocar esse codigo numa aplicação que estou a fazer e lá faz o upload para a bd mas dps mostra a cruzinha na imagem.

Tb ja postei lá o codigo todo que tenho a ver se me conseguem ajudar...

Brigado.

Majin Vegeta
26-06-2008, 14:50
se precisarem que poste o codigo eu posto mas vai ficar com algumas variaveis minhas. depois têm de as adaptar

cumps