Melhores Práticas: Upload de Arquivo

Olá. Hoje sabemos como está fácil realizar upload de arquivos. No entanto, tenho algumas dúvidas quanto a:

1 - Nome do Arquivo. Qual nome voce dá ao arquivo em upload?

2 - Se o upload (ex. da foto) estiver junto com a regra de cadastro, voce separa os códigos de cadastro e o código de upload?

3 - Se for uma imagem, por exemplo, voce define um tamanho máximo de arquivo, bloqueando, ou voce manipula o arquivo para gerar uma espécie de Thumbnail?

4 - Voce usa alguma biblioteca JS para realizar upload? (Tipo Uploadify, ajax uploader), ou vai no jeito tradicional?

Pra mim isso não faz diferença

Não. Apenas especifico no form que tem um “carinha” multipart junto com a galera

Geralmente coloco um tamanho máximo sim, e caso ultrapasse ele não valida e volta pro form informando o usuário. E mesmo assim eu manipulo o arquivo gerando os thumbnails adequados para minha aplicação.

Uma vez utilizei JS apenas para fazer cropping, mas geralmente faço do jeito tradicional, com um formzão acessando uma action que espera os parametros (dentre eles o file).

Pra mim isso não faz diferença

Não. Apenas especifico no form que tem um “carinha” multipart junto com a galera

Geralmente coloco um tamanho máximo sim, e caso ultrapasse ele não valida e volta pro form informando o usuário. E mesmo assim eu manipulo o arquivo gerando os thumbnails adequados para minha aplicação.

Uma vez utilizei JS apenas para fazer cropping, mas geralmente faço do jeito tradicional, com um formzão acessando uma action que espera os parametros (dentre eles o file).[/quote]

1 - Nome do arquivo nao faz diferença? Se subir dois arquivos com mesmo nome? Que voce faz? Voce nao faz criptografia no nome do arquivo?

2 - Nesse caso quis dizer sobre o código do servidor. Por exemplo, voce mistura regra de cadastro com regra de upload, ou deixa, por exemplo, em classes separadas?

Abraço!

1 - Foi mal, interpretei errado neste caso. Geralmente a imagem (file enviado) está associada a alguma entidade do sistema. Utilizo o ID da entidade em hexa (seguido do tipo de thumb p,b ou g) fazendo divisão por milhar nos diretórios. Ex: 2Fp.jpg, 2Fm.jpg. Foi isso que vc quis dizer?

2 - Ja tive que desenvolver aplicações onde o requisito do “cliente” era que ficasse tudo num formulário de cadastro só. Aí no código do servidor eu tratava o file e o cadastro no mesmo método. Eu não gosto disso. Comecei a praticar os famosos “baby steps” no cadastro.

  • Primeira tela pede informações de login e senha. A partir daí o usuário ja estaria cadastrado no sistema.
  • A próxima já é tela de edição (informações complementares, avatar, etc), e o form de upload do avatar seria em uma das abas de edição, sozinho, com sua regra de negócio propria.

De início eu tinha generalizado upload pra vários casos. Mas neste caso específico para cadastro eu costumo separar sim. Acho inclusive muito mais usável para o usuário.

[quote=leandronsp]1 - Foi mal, interpretei errado neste caso. Geralmente a imagem (file enviado) está associada a alguma entidade do sistema. Utilizo o ID da entidade em hexa (seguido do tipo de thumb p,b ou g) fazendo divisão por milhar nos diretórios. Ex: 2Fp.jpg, 2Fm.jpg. Foi isso que vc quis dizer?

2 - Ja tive que desenvolver aplicações onde o requisito do “cliente” era que ficasse tudo num formulário de cadastro só. Aí no código do servidor eu tratava o file e o cadastro no mesmo método. Eu não gosto disso. Comecei a praticar os famosos “baby steps” no cadastro.

  • Primeira tela pede informações de login e senha. A partir daí o usuário ja estaria cadastrado no sistema.
  • A próxima já é tela de edição (informações complementares, avatar, etc), e o form de upload do avatar seria em uma das abas de edição, sozinho, com sua regra de negócio propria.

De início eu tinha generalizado upload pra vários casos. Mas neste caso específico para cadastro eu costumo separar sim. Acho inclusive muito mais usável para o usuário.[/quote]

1 - Exatamente, esse é o ideal. No entanto, vamos pegar como exemplo, cadastro de uma pessoa com foto. Se voce for utilizar o ID dessa entidade, primeiro é necessário gravar esta entidade no Banco, retornar o ID gerado na gravação, para depois enfim gerar o hexa do ID, setar como nome da foto. Depois é necessario gravar o nome gerado em um campo desta entidade (ex. Foto), que terá o nome do arquivo. Nesse caso o único fluxo de cadastro teve que fazer dois esforço, um para gravar, e outro para dar um update após a inserção da foto. Isso é péssimo para desempenho.

Como lidar nesses casos?

[quote=Lucas Emanuel]1 - Exatamente, esse é o ideal. No entanto, vamos pegar como exemplo, cadastro de uma pessoa com foto. Se voce for utilizar o ID dessa entidade, primeiro é necessário gravar esta entidade no Banco, retornar o ID gerado na gravação, para depois enfim gerar o hexa do ID, setar como nome da foto. Depois é necessario gravar o nome gerado em um campo desta entidade (ex. Foto), que terá o nome do arquivo. Nesse caso o único fluxo de cadastro teve que fazer dois esforço, um para gravar, e outro para dar um update após a inserção da foto. Isso é péssimo para desempenho.

Como lidar nesses casos?[/quote]
Eu não gravo o nome gerado da foto na base. Por exemplo, eu salvo o nome da foto com o hexa do ID do usuário => toHex(usuario.getId()) + ".jpg". Na entidade usuário ( ou algum outro helper ) eu tenho um método getUrlFoto(), que retorna a url quando eu preciso, e desta forma não preciso fazer update:

return "diretorio" + toHex(usuario.getId()) + ".jpg"

Fora que ter um campo na entidade só pra guardar o path físico não acho uma boa prática.

[quote=leandronsp][quote=Lucas Emanuel]1 - Exatamente, esse é o ideal. No entanto, vamos pegar como exemplo, cadastro de uma pessoa com foto. Se voce for utilizar o ID dessa entidade, primeiro é necessário gravar esta entidade no Banco, retornar o ID gerado na gravação, para depois enfim gerar o hexa do ID, setar como nome da foto. Depois é necessario gravar o nome gerado em um campo desta entidade (ex. Foto), que terá o nome do arquivo. Nesse caso o único fluxo de cadastro teve que fazer dois esforço, um para gravar, e outro para dar um update após a inserção da foto. Isso é péssimo para desempenho.

Como lidar nesses casos?[/quote]
Eu não gravo o nome gerado da foto na base. Por exemplo, eu salvo o nome da foto com o hexa do ID do usuário => toHex(usuario.getId()) + ".jpg". Na entidade usuário ( ou algum outro helper ) eu tenho um método getUrlFoto(), que retorna a url quando eu preciso, e desta forma não preciso fazer update:

return "diretorio" + toHex(usuario.getId()) + ".jpg"

Fora que ter um campo na entidade só pra guardar o path físico não acho uma boa prática.[/quote]

Olá, interessante sua abordagem.

Só uma dúvida. Voce diz que criou um método que retorna :

return "diretorio" + toHex(usuario.getId()) + ".jpg";

Só que nesse caso, ele está sempre retornando JPG. Se o usuario fez upload de uma foto com outras extensões, png, gif, etc, como voce lida com estas situações, sem ter no base o path físico da imagem?

Ou voce manipula a imagem para que ele sempre seja JPG?

Value ! :slight_smile:

Geralmente eu manipulo o stream e escrevo como jpeg. Inclusive até criei um utilitário para facilitar esta rotina:

Nunca não manipulei. É complicado deixar livre as extensões.