Jump to content
t0ze

Melhor metodo de upload de ficheiros

Recommended Posts

t0ze

Bom dia,

Dado que a minha experiência com upload de ficheiros e toda a lógica/performance/limitações que isso compreende, gostaria de vos perguntar da vossa experiência:

A) fazer upload de ficheiros para um campo binário na base de dados (guardar ficheiros em base de dados)

B)Guardar ficheiros em pastas no servidor.

As minhas dúvidas em relação à opção A) são;

As bases de dados mysql desses servidores gratuitos por aí, aceitam campos deste tipo?

Este método pode tornar o carregamento mais lento em comparação com a opção :thumbsup: ?

Em relação à opção :P

Imaginemos que tenho o ficheiro.jpg numa pasta de servidor, e imaginemos que vou fazer upload de um ficheiro de conteúdo diferente mas com o mesmo nome (ficheiro.jpg). Como é que este tratamento pode ser feito?

Obrigado,

Para já é só.

Share this post


Link to post
Share on other sites
IvanGS

o melhor método é guardares o nome da imagem na DB tipo ficheiro.jpg e ao fazer o echo para mostrares a imagem metes o caminho...

em relação ao tipo de ficheiro, podes ir buscar os últimos 3 dígitos e ver se corresponde a jpg, png, gif o que quiseres...

Share this post


Link to post
Share on other sites
t0ze

Ok, então guardar o caminho do ficheiro em base de dados e fazer o upload para uma pasta do servidor. Em relação ao tipo de ficheiro, nas propriedades do form de upload conseguimos "sacar" o filetype do ficheiro introduzido?

Desculpa a insistência, mas continuo com a mesma dúvida. Se o utilizador fizer o upload de um ficheiro com o mesmo nome e extensão de um que já existe no servidor. Vai haver um ficheiro(2).jpg ou algo assim. Estou a complicar ?

Share this post


Link to post
Share on other sites
IvanGS

boa solução, metes tu um nome no upload em vez de ser o que o cliente fez o upload tipo a imagem vem assim ficheiro.jpg e tu metes-la assim 342102_nomedoclietne.jpg

Share this post


Link to post
Share on other sites
asworm

crias uma espécie de ID que guardas na base de dados.... e incrementas conforme a necessidade...


Got it?

Share this post


Link to post
Share on other sites
t0ze

@IvanGS Ok, parece me bem. Obrigado.

@asworm sim, estava a pensar em fazer mais ou menos assim, obg.

Portanto, a pratica comum é a de enviar os ficheiros para o servidor e guardar os caminhos em BD?

Cumpz

Share this post


Link to post
Share on other sites
Lfscoutinho

Boas,

Como já foi dito o que deves fazer é guardares o nome da imagem na base de dados e fazer upload da imagem para o servidor.

Para evitares nomes iguais, podes e deves "encriptar" o nome + a data actual com MD5().

Share this post


Link to post
Share on other sites
mAiN_iNfEcTiOn

Para evitares nomes iguais, podes e deves "encriptar" o nome + a data actual com MD5().

Na realidade sugeria o seguinte:

$filename = "teste.txt";
$info = pathinfo($filename);
$filename = uniqid(time()) . '.' . $info['extension'];

Assim gera um id unico, com o timestamp como prefixo do nome....

Se o ficheiro for para download, aconselhava também a efectuar a criação de um md5 do tamanho do ficheiro como CHECKSUM e disponibilizá-lo para o utilizador poder verificar se o download foi efectuado com sucesso (à imagem das distros de linux, por exemplo).

Share this post


Link to post
Share on other sites
asworm

Boas,

Como já foi dito o que deves fazer é guardares o nome da imagem na base de dados e fazer upload da imagem para o servidor.

Para evitares nomes iguais, podes e deves "encriptar" o nome + a data actual com MD5().

Encriptar o nome do ficheiro para quê??? se é para os utilizadores enviarem para lá ficheiros é bom que estes sejam acesseveis não???


Got it?

Share this post


Link to post
Share on other sites
mAiN_iNfEcTiOn

Encriptar o nome do ficheiro para quê??? se é para os utilizadores enviarem para lá ficheiros é bom que estes sejam acesseveis não???

O "encriptar" (termo correcto é cifrar) do nome não serve para colocar um ficheiro inacessível... Serve sim para garantir (dependendo de como o nome é encriptado) que o nome é único...

Por exemplo:

# Nome original
$filename_original = "nome_do_ficheiro_original.txt";

/*
Imagina que tu já tinhas um ficheiro na pasta chamado nome_do_ficheiro_original.txt...

  ... não poderias fazer upload porque senão irias fazer overwrite certo? ...

  O ideal é gerar um nome único:
*/
$filename_unico = md5(date('YmdHis')) . '.txt';

# E porque é que é único ? Porque a função md5() - que serve para 'encriptar'/cifrar 
# uma palavra - está a usar a data  - no formato 20110517183311 (ao momento da escrita) - para gerar algo unico... 

# Imagina que usavas sempre a mesma palavra:
$filename_unico = md5('sempre_a_mesma_palavra');

# O resultado seria sempre o mesmo.... portanto nao seria nada unico....
# Se usares a data (ao segundo) ou o timestamp ( time() ) vais ter sempre uma palavra cifrada diferente....
# Mas o mesmo se passaria se só usasses o timestamp  Portanto:
$filename_unico = time() . '.txt'; # É unico à mesma maneira 

# Nota: se estivermos a falar de um upload de multiplos ficheiros simultaneamente, o processo pode ser processado
# no mesmo segundo.... eu recomendo o uso do método que referenciei no último post... ou seja, usando a uniqid()

Abraço

Share this post


Link to post
Share on other sites
apocsantos

    Boa tarde,

    Tendo em conta que é complicado filtrar de forma 100% fiável o tipo de ficheiro eu optaria por guardar o ficheiro num directório fora do web root, ou criar um directorio dentro do webroot e limitar o acesso do apache ao directório.

      Aqui fica um link de um bom documento sobre este tema: http://www.scanit.be/uploads/php-file-upload.pdf, espero que ajude.

Cordiais cumprimentos,

Apocsantos


"A paciência é uma das coisas que se aprendeu na era do 48k" O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"

Share this post


Link to post
Share on other sites
IvanGS

ou podias gravar os caminhos nu ficheiro PHP que estivesse dentro de uma pasta com um htacess

Share this post


Link to post
Share on other sites
mAiN_iNfEcTiOn

    Boa tarde,

    Tendo em conta que é complicado filtrar de forma 100% fiável o tipo de ficheiro eu optaria por guardar o ficheiro num directório fora do web root, ou criar um directorio dentro do webroot e limitar o acesso do apache ao directório.

      Aqui fica um link de um bom documento sobre este tema: hhttp://www.scanit.be/uploads/php-file-upload.pdf, espero que ajude.

Cordiais cumprimentos,

Apocsantos

:D Obrigado apocsantos :D :D Irei ler esse .pdf... No entanto, e permite-me a correcção... tens um "h" a mais no endereço :D :D

Share this post


Link to post
Share on other sites
Lfscoutinho

    Boa tarde,

    Tendo em conta que é complicado filtrar de forma 100% fiável o tipo de ficheiro eu optaria por guardar o ficheiro num directório fora do web root, ou criar um directorio dentro do webroot e limitar o acesso do apache ao directório.

      Aqui fica um link de um bom documento sobre este tema: hhttp://www.scanit.be/uploads/php-file-upload.pdf, espero que ajude.

Cordiais cumprimentos,

Apocsantos

Muito bom realmente. Não estive a ver detalhadamente, mas do que vi... não sabia que era possível mudar o header de um ficheiro. Como é que isso é feito !? (Só por curiosidade)

Share this post


Link to post
Share on other sites
mAiN_iNfEcTiOn

Após ter lido o documento - e embora considere que tens razão - a verdade é que aquele documento cobre todos os aspectos negativos do upload.... mas não indica sumariamente uma maneira correcta.

Eu elaborei um tutorial sobre upload de ficheiros à uns tempos noutro fórum (se não for permitido, digam ou removam... não sei se é), aqui: http://portugalcode.com/index.php/topic,2296.0.html

Embora não esteja colorido (isso dantes tinha Geshi agora não tem) eu acho que está bastante completo....

No entanto apocsantos, o tut não coloca os ficheiros numa directoria fora do DOCUMENT_ROOT ... Mas para upload de imagens a serem usadas no site, ou seja para serem visualizadas por todos... Não faz sentido ter um script php a controlar o acesso se toda a gente pode ter acesso... faz sentido sim controlar quais as extensões que são usadas.

( E uma boa configuração do servidor :D )

Sem falar que com uma boa protecção CSRF (que no fundo é básica, é gerar um token guardar na sessão e passá-lo por hidden field... se for igual dos dois lados, é válido).... e puff la se vai o script a aceder directamente ao upload.php :D

Share this post


Link to post
Share on other sites
apocsantos

    Boa noite,

    Eu apenas coloquei o link para o documento, porque na altura em que o li e no contexto me pareceu útil. Não o considero a "derradeira solução", mas sim uma apresentação de algumas situações que me pareceram pertinentes neste tópico.

    Fico a aguardar o tutorial, pois gosto sempre de ler, e  ler nunca é demais.

Cordiais cumprimentos,

Apocsantos


"A paciência é uma das coisas que se aprendeu na era do 48k" O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.