Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Salve salve!!!
Consegui um código aqui no fórum mesmo, está funcionando legal. Mas as postagens são de 2010, então acho que não terei resposta se perguntar por lá. Por isso criei este post.
O código faz o upload de apenas 1 imagem e renomeia por md5.
Por favor, não exijam muito de mim, pois sou noobasso em PHP. :yes:
- Preciso que este código permita upload múltiplo (6 imagens);
- Tenho em meu DB 6 colunas destinadas às imagens (img1, img2, img3, img4, img5 e img6) que aceitam valores NULL. Se o código me fornecer o nome das imagens, me viro para fazer o update no banco;
Segue o código:
index.php
<?php
if(isset($_POST['acao']) && $_POST['acao'] == 'cadastrar'){
$foto = $_FILES['foto'];
if($foto['type'] == 'image/jpeg'){
require("funcao_upload.php");
$name = md5(uniqid(rand(), true)).".jpg";
Redimensionar($foto, $name, 150, "images");
}
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Redimensionar Imagem</title>
</head>
<body>
<form method="post" action="" enctype="multipart/form-data">
<label>Foto<input type="file" name="foto" /></label>
<input type="submit" value="Enviar" />
<input type="hidden" name="acao" value="cadastrar" />
</form>
</body>
</html>
funcao_upload.php
<?php
function Redimensionar($imagem, $name, $largura, $pasta){
$img = imagecreatefromjpeg($imagem['tmp_name']);
$x = imagesx($img);
$y = imagesy($img);
$altura = ($largura * $y)/$x;
$nova = imagecreatetruecolor($largura, $altura);
imagecopyresampled($nova, $img, 0, 0, 0, 0, $largura, $altura, $x, $y);
imagejpeg($nova, "$pasta/$name");
imagedestroy($img);
imagedestroy($nova);
return $name;
}
?>
Se alguém me ajudar nessa, serei muito grato, pois já procurei por todo lado e nada...
Vlw
Agradeço muito sua postagem, Gabriel.
Como disse, sou iniciante em PHP e MySQL, talvez por isso não tenha compreendido muito bem o funcionamento do script.
Utilizei exatamente o código que postou e ocorre que, ou as imagens não são enviadas ou não são inseridas na pasta destino, ao contrário do código original que fazia o upload e as renomeava perfeitamente.
Corrigi o $_FILE do seu código para $_FILES e o AS $foto para as $foto.
Outra dúvida. Sobre os vetores, não é necessário informar algum valor (posição) dentro dos colchetes? E neste caso, como eu obteria o nome das fotos para inserção no BD?
Tenho estudado PHP e MySQL autodidata, portanto, não tenho muitas opções para tirar dúvidas.
Sobre o código, não é meu. Foi obtido aqui no fórum mesmo.
Abs
Utilizei exatamente o código que postou e ocorre que, ou as imagens não são enviadas ou não são inseridas na pasta destino, ao contrário do código original que fazia o upload e as renomeava perfeitamente.
Vamos descobrir o que acontece no código então.
>
Corrigi o $_FILE do seu código para $_FILES e o AS $foto para as $foto.
Falha minha.
>
Outra dúvida. Sobre os vetores, não é necessário informar algum valor (posição) dentro dos colchetes? E neste caso, como eu obteria o nome das fotos para inserção no BD?
Quando não é informado valores, é utilizado o primeiro inteiro, inciando em 0 que ainda não tenha sido utilizado, para a chave.
>
Tenho estudado PHP e MySQL autodidata, portanto, não tenho muitas opções para tirar dúvidas.
Estude cada código que você encontrar por ai. Saiba para que serve cada linha do código. Esse foi meu início
Mas iremos por partes. Insira esse código, e vejamos o seu retorno, vou cobrir todas as áreas:
require("funcao_upload.php");
if(isset($_POST['acao']) && $_POST['acao'] == 'cadastrar'){
echo '<pre>';
var_dump($_FILES);
echo '</pre>';
foreach($_FILE['foto'] AS $foto) {
echo '<pre>';
var_dump($foto);
echo '</pre>';
if($foto['type'] == 'image/jpeg'){
$name = md5(uniqid(rand(), true)).".jpg";
Redimensionar($foto, $name, 150, "images");
}
}
}
Poste o retorno do código, e veremos o que acontece. Mande também o código da função Redimensionar.
Retorno do código:
array(1) { ["foto"]=> array(5) { ["name"]=> array(6) { [0]=> string(17) "Chrysanthemum.jpg" [1]=> string(10) "Desert.jpg" [2]=> string(0) "" [3]=> string(0) "" [4]=> string(0) "" [5]=> string(0) "" } ["type"]=> array(6) { [0]=> string(10) "image/jpeg" [1]=> string(10) "image/jpeg" [2]=> string(0) "" [3]=> string(0) "" [4]=> string(0) "" [5]=> string(0) "" } ["tmp_name"]=> array(6) { [0]=> string(14) "/tmp/phpX8e6Ef" [1]=> string(14) "/tmp/phpTqsf0i" [2]=> string(0) "" [3]=> string(0) "" [4]=> string(0) "" [5]=> string(0) "" } ["error"]=> array(6) { [0]=> int(0) [1]=> int(0) [2]=> int(4) [3]=> int(4) [4]=> int(4) [5]=> int(4) } ["size"]=> array(6) { [0]=> int(879394) [1]=> int(845941) [2]=> int(0) [3]=> int(0) [4]=> int(0) [5]=> int(0) } } } array(6) { [0]=> string(17) "Chrysanthemum.jpg" [1]=> string(10) "Desert.jpg" [2]=> string(0) "" [3]=> string(0) "" [4]=> string(0) "" [5]=> string(0) "" } array(6) { [0]=> string(10) "image/jpeg" [1]=> string(10) "image/jpeg" [2]=> string(0) "" [3]=> string(0) "" [4]=> string(0) "" [5]=> string(0) "" } array(6) { [0]=> string(14) "/tmp/phpX8e6Ef" [1]=> string(14) "/tmp/phpTqsf0i" [2]=> string(0) "" [3]=> string(0) "" [4]=> string(0) "" [5]=> string(0) "" } array(6) { [0]=> int(0) [1]=> int(0) [2]=> int(4) [3]=> int(4) [4]=> int(4) [5]=> int(4) } array(6) { [0]=> int(879394) [1]=> int(845941) [2]=> int(0) [3]=> int(0) [4]=> int(0) [5]=> int(0) }
funcao_upload.php (faz o upload e redimensiona):
<?php
function Redimensionar($imagem, $name, $largura, $pasta){
$img = imagecreatefromjpeg($imagem['tmp_name']);
$x = imagesx($img);
$y = imagesy($img);
$altura = ($largura * $y)/$x;
$nova = imagecreatetruecolor($largura, $altura);
imagecopyresampled($nova, $img, 0, 0, 0, 0, $largura, $altura, $x, $y);
imagejpeg($nova, "$pasta/$name");
imagedestroy($img);
imagedestroy($nova);
return $name;
}
?>
Continuo agradecendo toda a ajuda... =)
O problema está no foreach e no modo que a superglobal $_FILES trabalha com os vetores, segue as correções:
if(isset($_POST['acao']) && $_POST['acao'] == 'cadastrar'){
foreach($_FILES['foto']['name'] AS $key => $foto) {
$foto = array(
'name' => $foto,
'type' => $_FILES['foto']['type'][$key],
'tmp_name' => $_FILES['foto']['tmp_name'][$key],
'error' => $_FILES['foto']['error'][$key],
'size' => $_FILES['foto']['size'][$key]
);
if($foto['type'] == 'image/jpeg'){
$name = md5(uniqid(rand(), true)).".jpg";
Redimensionar($foto, $name, 150, "images");
}
}
}
Como a superglobal $_FILES trabalha um pouco diferente em um vetor de arquivos (diferente da superglobal $_POST, por exemplo), tive de recriar o vetor para não precisar alterar nada na sua função de redimensionar. Acredito que isso resolva a sua questão.véi, na boa... uploadify faz tudo isso que necessitas e não limita em 6 a quantidade de imagens...
Vc cria uma coluna categoria na linha (imagens) e pronto.... baixe em www.uploadify.com
veja o arquivo "uploadify/uploadify.php"
up da imagem, inser no bd, renomeia e redimensona... xique mesmo....
<?
include "conect.php";
$galeria = $_GET["galeria"];
?>
<?php// Define a destination
$targetFolder = '../uploads/'; // Relative to the root
$verifyToken = md5('unique_salt' . $_POST['timestamp']);
if (!empty($_FILES) && $_POST['token'] == $verifyToken) {
$img = $_FILES['Filedata']['name'];
$ext = substr($img, -4);
$img = md5($img).date("dmYHis").$ext;
$tempFile = $_FILES['Filedata']['tmp_name'];
$targetPath = $targetFolder;
$targetFile = rtrim($targetPath,'/') . '/' . $img;
// Validate the file type
$fileTypes = array('jpg','jpeg','gif','png'); // File extensions
$fileParts = pathinfo($_FILES['Filedata']['name']);
$adicionar = mysql_query("INSERT INTO fotos(foto, galeria) VALUES('$img', '$galeria')");
if (in_array($fileParts['extension'],$fileTypes)) {
move_uploaded_file($tempFile,$targetFile);
echo '1';
} else {
echo 'Invalid file type.';
}
}
$imgsize = getimagesize($targetFile);
switch(strtolower(substr($targetFile, -3))){
case "jpg":
$image = imagecreatefromjpeg($targetFile);
break;
case "png":
$image = imagecreatefrompng($targetFile);
break;
case "gif":
$image = imagecreatefromgif($targetFile);
break;
default:
exit;
break;
}
$height = 500; //New width of image
$width = $imgsize[0]/$imgsize[1]*$height; //This maintains proportions
$src_w = $imgsize[0];
$src_h = $imgsize[1];
$picture = imagecreatetruecolor($width, $height);
imagealphablending($picture, false);
imagesavealpha($picture, true);
$bool = imagecopyresampled($picture, $image, 0, 0, 0, 0, $width, $height, $src_w, $src_h);
if($bool){
switch(strtolower(substr($targetFile, -3))){
case "jpg":
header("Content-Type: image/jpeg");
$bool2 = imagejpeg($picture,$targetPath.$img,80);
break;
case "png":
header("Content-Type: image/png");
imagepng($picture,$targetPath.$img);
break;
case "gif":
header("Content-Type: image/gif");
imagegif($picture,$targetPath.$img);
break;
}
}
imagedestroy($picture);
imagedestroy($image);
echo '1'; // Important so upload will work on OSX
?>
véi, na boa... uploadify faz t
Opções aqui, é o que não faltam. Vou lhe dar bastante "puxões de orelha", mas não é para criticar negativamente e sim para evoluir.
Primeiro, sugiro a alteração da forma que salvará as imagens. Com o seu atual ER, você está limitando ao máximo de 6 imagens, e ainda por cima, terá que verificar se determinada coluna possui uma imagem. Entender sobre Normalização de Dados é importante para uma melhor abstração do SGBD.
Mas agora ao seu problema. Você possui um formulário simples, e vamos mantê-lo simples. Vamos utilizar uma característica do HTML com POST. Criaremos um vetor de imagens:
Vamos ao PHP. Uma grande vantagem de utilizar em vetor, é iteração.
O código em PHP, para a iteração, se daria da seguinte maneira (baseando-se no seu código).
Para os inputs do formulário, eu sugeriria a criação por javascript, pois a coisa se tornaria mais dinâmica, e o usuário poderia colocar N imagens.