Ir para conteúdo
Fórum Script Brasil
  • 0

dúvidas com upload e demonstração do arquivo


lucas1407

Pergunta

bom dia povo, estou com uma dúvida aqui sobre demostração de arquivos feitos uploads., e com uploads.

1. Estou usando a pasta 'uploads', para salvar as imagens e arquivos, o problema é: se duas pessoas enviarem um arquivo com mesmo nome, ex. "foto", só vai ficar uma imagem, eu quero que todas sejam enviadas, tentei usar o rand, assim:

$dir = 'uploads'.DIRECTORY_SEPARATOR;
$file = isset($_FILES['file']) ? $_FILES['file'] : FALSE;
$rand = rand(1, 99999);
for($i=0; $i<count($file['name']); $i++)
{
if(isset($_FILES["file"]) && move_uploaded_file($file['tmp_name'][$i],$dir.$rand.$file['name'][$i]))
    {
            $path = $dir.$rand.$file['name'][$i]."";
mas queria saber se vocês tem uma outra ideia, 2.eu quero na demonstração dos arquivos assim: se for imagem fique mostrando uma miniatura dela e se clicar faça o download, se não for, fique apenas o link para download e o nome. 3. Estou salvando o link e o nome dos aruivos no banco de dados, mas o nome fica por exemplo "imagem.png", eu queria saber como que faz para por apenas "imagem", sem o formato. código que estou usando para inserir no MySQL é esse:
$file['name'][$i]

4. Queria saber se tem como um membro quando acaba de preencher um campo "file", crie outro automáticamente no formulário, e no máximo possa ter 5 arquivos

desculpa pelo trabalho, mas quem poder me ajudar, obrigado

Editado por ghs_
Link para o comentário
Compartilhar em outros sites

14 respostass a esta questão

Posts Recomendados

  • 0

Apesar de remota a chance, usar rand pode acontecer de ocorrer nomes iguais. Uma ideia é fazer assim (não testei o código):

<?php
$dir = 'uploads'.DIRECTORY_SEPARATOR;

if(!empty($_FILES['file']['name']))
{
  for($i=0; $i<count($_FILES['file']['name']); $i++)
  {
    $file_name = $_FILES['file']['name'][$i];
    $raiz = $file_name;

    $j=0;
    while(file_exists($dir.$file_name))
    {
      $file_name = $raiz.$j;
      $j++;
    }
    move_uploaded_file($_FILES['file']['tmp_name'][$i],$dir.$file_name);
  }
}
?>
Para salvar apenas o nome do arquivo, sem a extensão:
<?php
$tam = strrpos($_FILES['file']['name'],".");
$nome = substr($_FILES['file']['name'],0,$tam);
?>
Aí na hora de definir se deve exibir uma miniatura basta testar se o tipo:
<?php
$tipo = mime_content_type($nome_do_arquivo);
if(substr($tipo,0,5) == "image)
{
  echo "É imagem";
}
else
{
  echo "Não é imagem";
}
?>

Editado por svjets
Link para o comentário
Compartilhar em outros sites

  • 0

Isso, essa função verifica o tipo do arquivo. Na verdade ela está em desuso pois existe outra função (fileinfo_open) que retorna mais informações sobre o arquivo, mas não entendi direito como usar a outra função e esta serve para o que você quer. :D

E, meu primeiro código agora vi que vai ficar estranho, rs. Abaixo o corrigido. Basicamente, ele pega o nome do arquivo (ex: data.txt). Verifica se já existe algum arquivo com mesmo nome no diretório uploads. Se existir ele concatena $j ao nome ficando no código corrigido (data0.txt). Então ele verifica se há algum arquivo com este nome (data0.txt) e se houver, ele gera um novo nome (no caso, data1.txt) e vai incrementando de 1 em 1 até que termine com um nome que ainda não existe no diretório. Abaixo o código corrigido:

<?php
$dir = 'uploads'.DIRECTORY_SEPARATOR;

if(!empty($_FILES['file']['name']))
{
  for($i=0; $i<count($_FILES['file']['name']); $i++)
  {
    $file_name = $_FILES['file']['name'][$i];

    $tr = strrpos($_FILES['file']['name'],".");
    $raiz = substr($file_name,0,$tr);

    $tx = strlen($file_name) - $tr;
    $ext = substr($file_name,$tr,$tx);

    $j=0;
    while(file_exists($dir.$file_name))
    {
      $file_name = $raiz.$j.$ext;
      $j++;
    }
    move_uploaded_file($_FILES['file']['tmp_name'][$i],$dir.$file_name);
  }
}
?>

Link para o comentário
Compartilhar em outros sites

  • 0

vlw denovo, mas eu usei esse código para ver todos os arquivos e ver se é imagem:

while ($line = mysql_fetch_array($consult))

{

$name = $line["name"];

$path = $line["path"];

//verifica se é imagem ou não

$type = mime_content_type($name);

if(substr($type,0,5) == "image")

{

echo "É imagem";

}

else

{

echo "Não é imagem";

}

//fim da verificação de imagem

echo "<a href='$path'>$name</a> ";

}

mas deu esse erro na página:

Fatal error: Call to undefined function mime_content_type()
Link para o comentário
Compartilhar em outros sites

  • 0

No mime_content_type você precisa indicar o local do arquivo também. Acho que $path é o diretório do arquivo, não? Assim ficaria:

$type = mime_content_type($path."/".$name);
Se bem que este erro parece dizer que a função é indefinida. Dá para substituir no lugar do $type isto:
$finfo = finfo_open(FILEINFO_MIME);
$type = finfo_file($finfo, $path."/".$name);
finfo_close($finfo);

Link para o comentário
Compartilhar em outros sites

  • 0

a variaval $path é a pasta + o nome do arquivo, não pode por $path."/".$name;

mas de todo jeito falhou, não deu certo usando as 2 funções.

usando a 2° forma dá isso:

Call to undefined function finfo_open()
e usando a 1°:
Call to undefined function mime_content_type()

mas de todo jeito obrigado e vlw pelo esforço

Link para o comentário
Compartilhar em outros sites

  • 0

Está informando que as funções não foram definidas. Deve ser o seu php que não possui a biblioteca para essas funções. Testei as duas aqui e deu certo. O arquivo deve ser fornecido com o caminho para o diretório. Tipo: "C:/xampp/xampp/htdocs/xxx/uploads/nomdedoarquivo.extensão".

Link para o comentário
Compartilhar em outros sites

  • 0

mesmo podo tudo (C:/Users/Gabriel/Documents/gabriel/EasyPHP-5.3.3/www/teste/forum/uploads/$name) não deu certo, dá exatamente o mesmo erro.

isso pode ser por causa da minha versão do php?

o problema é que não sei qual, acho que é a 5.3.3

@ tem como usar uma função verifique o formato do arquivo na hora do upload, e armazenar o formato no banco de dados?

Editado por ghs_
Link para o comentário
Compartilhar em outros sites

  • 0

Usa o mesmo método que coloquei anteriormente. O resultado de "$_FILES['file']['type'] será "image/gif" para uma imagem gif, "image/png" para uma imagem png e etc. Então, verificando se os 5 primeiros caracteres da string do tipo correspondem a "image" resolve.

Editado por svjets
Link para o comentário
Compartilhar em outros sites

  • 0

vlw, consegui funcionar perfeitamente meu sistema de upload, agora só fica uma dúvida: como faz uplod de vídeos?

eu coloco o arquivo no form e envio mas não quer fazer o upload, tanbém não envia músicas, eu procurei na net, achei uns mas nada que faz sentido ou que funcione.

@ tem alguma forma de melhorar a proteção do meu sistema de upload, código:

<?php
$dir = 'uploads'.DIRECTORY_SEPARATOR;
$file = isset($_FILES['file']) ? $_FILES['file'] : FALSE;
$id_file = date("dmYGi");
$id_file .= rand(1, 99999);
for($i=0; $i<count($file['name']); $i++)
{
    if(isset($_FILES["file"]) && isset($_POST["description"]) && move_uploaded_file($file['tmp_name'][$i],$dir.$id_file.$file['name'][$i]))
    {
            $description = $_POST["description"];
            $path = $dir."/".$id_file.$file['name'][$i]."";
            $sql = "INSERT INTO `uploads`
            (name, description, path, id_topic, type)
            VALUES
            ('".$file['name'][$i]."', '$description', '$path', '$id_topic', '".$file['type'][$i]."')";
            $result = mysql_query($sql)
            or die("Falha na execução da consulta");
            echo"<script type='text/javascript'>alert ('Arquivo ".$file['name'][$i]." enviado com sucesso!')</script> ";
            
        }
        else
        {
        echo"<br><b>uploads</b>: Nenhum arquivo foi enviado.";
        }
    }



?>

@ na demostração dos arquivos eu queria colocar tipo que um bloco ao lado do outro, o problema é que se usar divs ou tables fica em baixo, e não no lado(como eu quero), você sabe como colocar uma ao lado da outra?

Nas imagens dá certo, mas nos links não.

@ desculpa aew por todo o trablaho, é que antes de criar esse tópico eu nunca tinha feito nada com uploads em php, vlw

Editado por ghs_
Link para o comentário
Compartilhar em outros sites

  • 0

Você pode verificar o tamanho dos arquivos que serão upados como segurança

if($arquivo["size"] > $config["tamanho"])
{
$erro[] = "Arquivo em tamanho muito grande! 
    A imagem deve ser de no máximo " . $config["tamanho"] . " bytes. 
    Envie outro arquivo";
}
e também os tipos de arquivos upados no caso eu acho muito mais seguro usar o myme-type
if(!eregi("^image\/(pjpeg|jpeg|png|gif|bmp)$", $arquivo["type"]))
{
$erro[] = "Arquivo em formato inválido! 
    A imagem deve ser jpg, jpeg, bmp, gif ou png. Envie outro arquivo";
}

Aí você pode adicionar mais formatos de arquivos que desejar.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      652k
×
×
  • Criar Novo...