Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

wdc_black_

[Resolvido] Upload Múltiplo de Fotos

Recommended Posts

galera, comecei a fazer esse codigo pra criar um simple album de fotos em php...

mas ta dando erro :/

e não to conseguindo resolver...

 

form

<form id="form1" name="form1" method="post" action="enviar.php" enctype="multipart/form-data">
<!-- nesse form abaixo eu indico o nome através de um array -->
Foto 1: <input type="file" name="foto[]" /><br>
Foto 2: <input type="file" name="foto[]" /><br>
Foto 3: <input type="file" name="foto[]" /><br>
Foto 4: <input type="file" name="foto[]" /><br>
Foto 5: <input type="file" name="foto[]" /><br>

<br /><input type="submit" name="button" value="Enviar" />
</form>

php

<?
include "conexao.php";

for($i=0;$i < 5; $i++){

	$foto = $_FILES['foto']['name'][$i];
	$procura = array(" ","ã","á","à","é","ê","è","í","ì","ó","õ","ç");
	$coloca = array("_","a","a","a","e","e","e","i","i","o","o","c");
	$foto = str_replace($procura, $coloca, $foto);
	$foto = strtolower($foto);
	
	if(!eregi("^image\/(jpeg|png|gif|pjpeg|jpg)$", $_FILES['foto']['type'])){
		
		echo "
		<META HTTP-EQUIV=REFRESH CONTENT='0; URL=index.php'>
		<script type=\"text/javascript\">
		alert(\"Formato inválido\");
		</script>
		";
		
	}else{
		
		if(file_exists("imagens/$foto")){
			$a = 1;
			while(file_exists("imagens/[$a]$foto")){
				$a++;
			}
			
			$foto = "[".$a."]".$foto;
			
		}
		
		if(!move_uploaded_file($_FILES['foto']['tmp_name'], "imagens/".$foto)){
			
			echo "
		<META HTTP-EQUIV=REFRESH CONTENT='0; URL=index.php'>
		<script type=\"text/javascript\">
		alert(\"Erro ao enviar o foto.\");
		</script>
		";
			
		}
	
	}	
		$sql = mysql_query("INSERT INTO upload ( id, foto , data ) VALUES ( '', '".$foto."' , NOW() ) ");
		if($sql != 0){
			echo "
			<META HTTP-EQUIV=REFRESH CONTENT='0; URL=index.php'>
			<script type=\"text/javascript\">alert(\"Foram enviadas %i fotos.\");</script>
			";
		}
		else{
		    echo "
			<META HTTP-EQUIV=REFRESH CONTENT='0; URL=index.php'>
			<script type=\"text/javascript\">alert(\"Erro ao enviar as fotos.\");</script>
			";
		}
}		

?>

ta dando erro de formato inválido :S

pq será ke ta dando isso? ja testei com varias imagens diferentes...

obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, para fazer Up load, eu usei esse script, porém apanho para upar os names pro banco, se nos ajudarmos, esse aqui upa e verifica normal!

 

 

$dir = "prop/"; //Extensões permitidas
$ext = array("gif","jpg","png"); //Quant. de campos do tipo FILE
$campos = 6; //Formulário
echo '<form method="post" action="" enctype="multipart/form-data">
Arquivo: <input type="file" name="file[]"><br />
Arquivo: <input type="file" name="file[]"><br />
Arquivo: <input type="file" name="file[]"><br />
Arquivo: <input type="file" name="file[]"><br />
Arquivo: <input type="file" name="file[]"><br />
Arquivo: <input type="file" name="file[]"><br />
<input type="submit" name="submit" value=" OK ">
</form>'; //Se for enviado if (isset($_POST['submit'])) { //Obtendo info. dos arquivos
$f_name = $_FILES['file']['name'];
$f_tmp = $_FILES['file']['tmp_name'];
$f_type = $_FILES['file']['type']; //Contar arquivos enviados
$cont=0; //Repetindo de acordo com a quantidade de campos FILE for($i=0;$i<$campos;$i++){ //Pegando o nome
$name = $f_name[$i]; //Verificando se o campo contem arquivo if ( ($name!="") and (is_file($f_tmp[$i])) and (in_array(substr($name, -3),$ext)) ) { if ($cont==0) {
echo "<b>Arquivo(s) enviados:<br /></b>"; }
echo $name." - "; //Movendo arquivo's do upload
$up = move_uploaded_file($f_tmp[$i], $dir.$name); //Status if ($up==true):
echo "<i>Enviado!</i>";
$cont++; else:
echo "<i>Falhou!</i>";
endif;

echo "<br />"; } }

echo ($cont!=0) ? "<br><i>Total de arquivos enviados: </i>".$cont : "Nenhum arquivo foi enviado!"; } 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Script simples e funcional, com 2 opçoes de insert sql.

 

linha por linha, ou tudo numa só linha.

<?php
header("Content-Type: text/html; charset=ISO-8859-1");

if( $_SERVER['REQUEST_METHOD']=='POST' )
{

	$caminho = 'uploads/imagens/';
	cria_dir( $caminho );//criando diretório, caso não exista
	
	for( $i=0; $i<count( $_FILES['foto'] ); $i++ )
	{
		$novo_nome = remove_acentos( $_FILES['foto']['name'][$i] );
		move_uploaded_file( $_FILES['foto']['tmp_name'][$i], $caminho.$novo_nome );
		
		$sql = ( !empty($_FILES['foto']['name'][$i]) ) ? "INSERT INTO imagens ( id, url ) VALUES (NULL, '{$novo_nome}')" : '';
		
		echo $sql, '<br />';//uma linha para cada foto
		$campos .= "'{$novo_nome}', ";
	}
	
	$campos = substr( $campos, 0 , -2);
	
	$sql = "INSERT INTO imagens (id, url1, url2, url3, url4, url5 )
		VALUES {$campos}";
		
	echo $sql;//todas na mesma linha
}

function remove_acentos( $string )
{
	$string = preg_replace("/[áàâãª]/i","a",$string);
	$string = preg_replace("/[éèê]/i","e",$string);
	$string = preg_replace("/[íìî]/i","i",$string);
	$string = preg_replace("/[óòôõº]/i","o",$string);
	$string = preg_replace("/[úù]/i","u",$string);
	$string = preg_replace("/[ç]/i","c",$string);
	
	return strtolower( $string );
}
function cria_dir( $dir ){
	if( !is_dir( $dir ) )
		if( mkdir( $dir, 0777, true) )
			return 'Diretório criado!';
}
?>
<html>
<head>
	<title>Envio de Múltiplas imagens</title>
</head>
<body>
	<form method="post" action="" enctype="multipart/form-data">
		Foto 1: <input type="file" name="foto[]" /><br />
		Foto 2: <input type="file" name="foto[]" /><br />
		Foto 3: <input type="file" name="foto[]" /><br />
		Foto 4: <input type="file" name="foto[]" /><br />
		Foto 5: <input type="file" name="foto[]" /><br />

		<input type="submit" name="button" value="Enviar" />
	</form>
</body>
</html>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tá... pensa assim cara: 'Por que o seu não funciona'?

 

if(!eregi("^image\/(jpeg|png|gif|pjpeg|jpg)$", $_FILES['foto']['type'])){
                
                echo "
                <META HTTP-EQUIV=REFRESH CONTENT='0; URL=index.php'>
                <script type=\"text/javascript\">
                alert(\"Formato inválido\");
                </script>
                ";
                
        }
você disse que só 'dá esse if', ne?!

veja que já tem um erro ai, deveria ser:

if(!eregi("^image\/(jpeg|png|gif|pjpeg|jpg)$", $_FILES['foto']['type'][$i])){
concorda?

pois você está testando 'foto por foto'.

 

Outro problema foi ter usado:

$i < 5;
prefira um count()

Compartilhar este post


Link para o post
Compartilhar em outros sites

hummmm é msm :/

n tinha visto esse problema, vlwww :D

 

-----------------

 

fiz a modificação mas continuou ou erro :S

 

--------------

e como seria a implementação desse comando count?

Compartilhar este post


Link para o post
Compartilhar em outros sites

arrumou também nos outros lugares ?

 

vou apontar as falhas que vi no teu script:

-> o laço percorre e tenta fazer toda a operação de mover, e insert, sem saber se existe arquivo naquela posição

-> limitado à 5 fotos, se enviar menos, mesmo assim, roda 5 vezes

-> a rotina para remover caracteres, é muito falha, aqui tentei enviar o arquivo do windows: Pôr do Sol.jpg, e a rotina não foi capaz de renomear

-> não 'garante' que exista a pasta de destino. Sendo que podia ter evitado uma falha óbvia do move_uploaded_file

-> novamente na hora de mover, faltou informar a posição atual na iteração do laço:

if(!move_uploaded_file($_FILES['foto']['tmp_name'], "imagens/".$foto)){
por:

if(!move_uploaded_file($_FILES['foto']['tmp_name'][$i], "imagens/".$foto)){
-> script muito mal identado

-> <meta> refresh, mal aplicado.

-> última cadeia de if/else sem sentido prático.

-> uso de eregi, função obsoleta

 

 

corrigido:

<?php
	//include 'conexao.php';

	$fotos = $_FILES['foto'];
	$enviadas = 0;
	$erros = Array();
	for( $i=0; $i<count($fotos['name']); $i++ )
	{
		if( !empty($fotos['name'][$i]) )
		{
			$foto = strtolower( $fotos['name'][$i] );
			$foto = str_replace(
				array(" ","ã","á","à","é","ê","è","í","ì","ó","õ",'ô',"ç"), 
				array("_","a","a","a","e","e","e","i","i","o","o",'o',"c"), 
				$foto);//muito falha essa verificação

			
			if( !preg_match( '/^image\/(jpeg|png|gif|pjpeg|jpg)$/', $fotos['type'][$i]) )
			{
				echo 'Formato inválido';
			}
			else
			{
				if( file_exists( 'imagens/'.$foto) )
				{
					$a = 1;
					while(file_exists( "imagens/[{$a}]{$foto}") )
						$a++;
					$foto = "[{$a}]{$foto}";
				}

				if( !@move_uploaded_file($fotos['tmp_name'][$i], 'imagens/'.$foto) )
				{
					$erros[] = $fotos['name'][$i];
					echo 'Erro ao enviar o foto';
				}
				else 
					$enviadas++;
			}
			$sql = "INSERT INTO upload ( id, foto , data ) VALUES ( NULL, '{$foto}' , NOW() ) ";
			echo $sql, '<br />';
			//$query = mysql_query( $sql )or die( mysql_error() );
		}
	}
	echo "Foram enviadas {$enviadas} foto(s) <br />";
	foreach( $erros AS $erro )
		echo "Falhou ao enviar a foto: {$erro} <br />";

?>
	<form method="post" action="" enctype="multipart/form-data">
		<!-- nesse form abaixo eu indico o nome através de um array -->
		Foto 1: <input type="file" name="foto[]" /><br />
		Foto 2: <input type="file" name="foto[]" /><br />
		Foto 3: <input type="file" name="foto[]" /><br />
		Foto 4: <input type="file" name="foto[]" /><br />
		Foto 5: <input type="file" name="foto[]" /><br />

		<br /><input type="submit" name="button" value="Enviar" />
	</form>
agora vai de você, fazer a adaptação, para separar o arquivo da action, num novo, e fazer a inserção no banco de dados.

Compartilhar este post


Link para o post
Compartilhar em outros sites

200% willian ;) nen sei como agradeçe :)

 

eu to com um script pronto aqui já pra deixar a pessoa escolher qtas fotos mandar...

 

<script>
var input = 0;
function mais(campo) {

var nova = document.getElementById("aqui");
var novadiv = document.createElement("div");
var nomediv = "div";
novadiv.innerHTML = ""+input+" <input type='file' name='foto[]' value=''>";
nova.appendChild(novadiv);

input++;
}
</script>

<form name="form" method="GET">
<input type="hidden" name="campo" value="">
<input type="button" value="adicionar input" onClick="mais(campo.value)">
<div id="aqui"></div>
<input type="submit">
</form>

adaptei ele fico show de bola :D

 

vlw msm ;)

abraço

Compartilhar este post


Link para o post
Compartilhar em outros sites

count()

http://www.php.net/count

 

é o 'tamanho' do $fotos['name'], que na verdade é: $_FILES['foto']['name']

assim você pode colocar qntos inputs name="foto[]", quiser, sem precisar alterar uma linha sequer do script php.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não sei se devo responder aqui, ou no tópico que criei (porém fui direcionado pra ca)

 

Eu adaptei o código para inserir as coisas no BD.

 



<?php
header("Content-Type: text/html; charset=ISO-8859-1");

include('bd.php');
$con = mysql_connect("$host", "$usuario", "$senha"); 
mysql_select_db("$bd", $con);
if( $_SERVER['REQUEST_METHOD']=='POST' )
{

        $caminho = 'propi/';
        cria_dir( $caminho );//criando diretório, caso não exista
        
        for( $i=0; $i<count( $_FILES['foto'] ); $i++ )
        {
                $novo_nome = remove_acentos( $_FILES['foto']['name'][$i] );
                move_uploaded_file( $_FILES['foto']['tmp_name'][$i], $caminho.$novo_nome );
                
                $sql = ( !empty($_FILES['foto']['name'][$i]) ) ? "INSERT INTO tl_prop (prop_image ) VALUES (NULL, '{$novo_nome}')" : '';
                
                //echo $sql, '<br />';//uma linha para cada foto
                $query = mysql_query($sql);
				$campos .= "'{$novo_nome}', ";
        }
        
        $campos = substr( $campos, 0 , -2);
        
include('bd.php');
$con = mysql_connect("$host", "$usuario", "$senha"); 
mysql_select_db("$bd", $con);
       $sql= "INSERT INTO tbl_prop (prop_image, prop_img2, prop_img3, prop_img4, prop_imag5 )
                VALUES {$campos}";
         $query = mysql_query($sql);     
       echo $sql;//todas na mesma linha
}

function remove_acentos( $string )
{
        $string = preg_replace("/[áàâãª]/i","a",$string);
        $string = preg_replace("/[éèê]/i","e",$string);
        $string = preg_replace("/[íìî]/i","i",$string);
        $string = preg_replace("/[óòôõº]/i","o",$string);
        $string = preg_replace("/[úù]/i","u",$string);
        $string = preg_replace("/[ç]/i","c",$string);
        
        return strtolower( $string );
}
function cria_dir( $dir ){
        if( !is_dir( $dir ) )
                if( mkdir( $dir, 0777, true) )
                        return 'Diretório criado!';
}
?>
<html>
<head>
        <title>Envio de Múltiplas imagens</title>
</head>
<body>
        <form method="post" action="" enctype="multipart/form-data">
                Foto 1: <input type="file" name="foto[]" /><br />
                Foto 2: <input type="file" name="foto[]" /><br />
                Foto 3: <input type="file" name="foto[]" /><br />
                Foto 4: <input type="file" name="foto[]" /><br />
                Foto 5: <input type="file" name="foto[]" /><br />

                <input type="submit" name="button" value="Enviar" />
        </form>
</body>
</html>

 

 

 

Mas não sei está inserindo, o UPLOAD é feito, as fotos vão pro ar, inclusive as alterações do nomes, tudo bonitinho, porém não está sendo cadastrado no BD.

Compartilhar este post


Link para o post
Compartilhar em outros sites

execute assim para saber o motivo:

$query = mysql_query( $sql )or die( mysql_error() );
melhor você responder no teu topico.. pois ai a tua solução, fica por lá também.

 

Apenas linkei este topico, para não ter que replicar código.

Compartilhar este post


Link para o post
Compartilhar em outros sites

willian, revivendo o tópico hehehe

eu tava afim de coloca um outro campo pra gravar junto...

 

<script>
var input = 0;
function mais(campo) {

var nova = document.getElementById("aqui");
var novadiv = document.createElement("div");
var nomediv = "div";
novadiv.innerHTML = "<input type='text' name='legenda[]' value='' style='width:193px;'> <input type='file' name='foto[]' value='' style='width:275px;'>";
nova.appendChild(novadiv);

input++;
}
</script>

<?php
        include '../conexao.php';
		
		$fotos = $_FILES['foto'];
		$legenda = $_FILES['legenda'];
        $enviadas = 0;
        $erros = Array();
        for( $i=0; $i<count($fotos['name']); $i++ )
        {
                if( !empty($fotos['name'][$i]) )
                {
                        $foto = strtolower( $fotos['name'][$i] );
                        $foto = str_replace(
                                array(" ","ã","á","à","é","ê","è","í","ì","ó","õ",'ô',"ç"), 
                                array("_","a","a","a","e","e","e","i","i","o","o",'o',"c"), 
                                $foto);//muito falha essa verificação

                        
                        if( !preg_match( '/^image\/(jpeg|png|gif|pjpeg|jpg)$/', $fotos['type'][$i]) )
                        {
                                echo 'Formato inválido';
                        }
                        else
                        {
                                if( file_exists( '../fotos/'.$foto) )
                                {
                                        $a = 1;
                                        while(file_exists( "../fotos/[{$a}]{$foto}") )
                                                $a++;
                                        $foto = "[{$a}]{$foto}";
                                }

                                if( !@move_uploaded_file($fotos['tmp_name'][$i], '../fotos/'.$foto) )
                                {
                                        $erros[] = $fotos['name'][$i];
                                        echo 'Erro ao enviar o foto';
                                }
                                else 
                                        $enviadas++;
                        }
						$sql = mysql_query("INSERT INTO album ( id, foto , legenda , data ) VALUES ( '', '".$foto."', '".$legenda."' , NOW() ) ");
                }
		}
        echo "Foram enviadas {$enviadas} foto(s) <br />";
        foreach( $erros AS $erro )
                echo "Falhou ao enviar a foto: {$erro} <br />";

?>

só que não grava a legenda :/

q q eu posso fazer?

tentei colocar um outro for dentro do for originall mas tambem nao funcionou...

Compartilhar este post


Link para o post
Compartilhar em outros sites

o input do legenda é do tipo text, logo:

$legenda = $_POST['legenda'];

e isso é um array, então, logo:

$sql = "INSERT INTO album ( id, foto , legenda , data ) VALUES ( NULL, '{$foto}', '{$legenda[$i]}' , NOW() ) ";
echo $sql, '<br />';
$query = mysql_query( $sql )or die( mysql_error() );

Compartilhar este post


Link para o post
Compartilhar em outros sites

deu erro nessa linha willian

 

$sql = "INSERT INTO album ( id, foto , legenda , data ) VALUES ( NULL, '{$foto}', '{$legenda[$i]}' , NOW() ) ";

Parse error: parse error in C:\xampp\htdocs\admin\funcoes\enviar-fotos.php  on line 41

Compartilhar este post


Link para o post
Compartilhar em outros sites

$sql = mysql_query("INSERT INTO album ( id, foto , legenda , data ) VALUES ( '', '".$foto."', '".$legenda[$i]."' , NOW() ) ");
e oque tinha na linha de cima ?

 

Post UP!

http://forum.imasters.com.br/index.php?app=core&module=help

Compartilhar este post


Link para o post
Compartilhar em outros sites

código completo

<?php
        include '../conexao.php';
		
		$fotos = $_FILES['foto'];
		$legenda = $_FILES['legenda'];
        $enviadas = 0;
        $erros = Array();
        for( $i=0; $i<count($fotos['name']); $i++ )
        {
                if( !empty($fotos['name'][$i]) )
                {
                        $foto = strtolower( $fotos['name'][$i] );
                        $foto = str_replace(
                                array(" ","ã","á","à","é","ê","è","í","ì","ó","õ",'ô',"ç"), 
                                array("_","a","a","a","e","e","e","i","i","o","o",'o',"c"), 
                                $foto);//muito falha essa verificação

                        
                        if( !preg_match( '/^image\/(jpeg|png|gif|pjpeg|jpg)$/', $fotos['type'][$i]) )
                        {
                                echo 'Formato inválido';
                        }
                        else
                        {
                                if( file_exists( '../fotos/'.$foto) )
                                {
                                        $a = 1;
                                        while(file_exists( "../fotos/[{$a}]{$foto}") )
                                                $a++;
                                        $foto = "[{$a}]{$foto}";
                                }

                                if( !@move_uploaded_file($fotos['tmp_name'][$i], '../fotos/'.$foto) )
                                {
                                        $erros[] = $fotos['name'][$i];
                                        echo 'Erro ao enviar o foto';
                                }
                                else 
                                        $enviadas++;
                        }
						$sql = mysql_query("INSERT INTO album ( id, foto , legenda , data ) VALUES ( '', '".$foto."', '".$legenda[$i]."' , NOW() ) ");
                }
		}
        echo "Foram enviadas {$enviadas} foto(s) <br />";
        foreach( $erros AS $erro )
                echo "Falhou ao enviar a foto: {$erro} <br />";

?>

não deu erro, mas n gravou a legenda no banco de dados :/

Compartilhar este post


Link para o post
Compartilhar em outros sites

troque:

$legenda = $_FILES['legenda'];
por:

$legenda = $_POST['legenda'];

Compartilhar este post


Link para o post
Compartilhar em outros sites

ehehe, era meio que obviu né, o input foto é um array de arquivos, e o legenda é array de texto :P

ratiei em n ver isso ^^

 

100% willian ;)

bombando a coisa agora :D

hehehe

vlww :P

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.