-
Notifications
You must be signed in to change notification settings - Fork 3
adicionando upload de multiplas imagens no jobRequest #72
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: develop
Are you sure you want to change the base?
Conversation
ronifabio
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
- Só está aparecendo os thumbnail da última ou últimas imagens enviadas pelo pressionamento do Adicionar.
- Saiba que o usuário pode querer adicionar uma imagem por vez pelo formulário. Então, se ele vai adicionar 3 imagens, ele abrirá a janela de upload 3 vezes. Por isso, é preciso guardar as URLs destas imagens, que já foram persistidas no Cloudinary, na sessão. Assim, o JSP vai ler estas URLs para apresentar corretamente os thumbnails.
- Verifique se os limites de tamanho de imagem definidos no application.properties estão sendo respeitados.
- spring.servlet.multipart.max-file-size=51000KB
- spring.servlet.multipart.max-request-size=51000KB
- Na verdade, estes valores estão muito altos, reduzir para 2000KB
- Apresentar mensagem de erro quando exceder este tamanho.
- O exception gerado é MaxUploadSizeExceededException
- Mesmo assim, usar a API de transformação de imagens do Cloudinary e ainda reduzir mais o tamanho para não ocupar tanto espaço de armazenamento.
| if (isValidateImage(image)) { | ||
| File jobImage = Files.createTempFile("temp", image.getOriginalFilename()).toFile(); | ||
| image.transferTo(jobImage); | ||
| Map data = cloudinary.uploader().upload(jobImage, ObjectUtils.asMap("folder", "jobs")); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
- Só para contextualização. Não tem problema de salvar no Cloudinary mesmo que o usuário desista do cadastro. Mesmo se o usuário desistir do cadastro, haverá outra história que removerá imagens antigas do Cloudinary. A API permite buscar as fotos por data.
| } | ||
|
|
||
| if (!successImages.isEmpty()) | ||
| sessionDTO.setImagesSession(successImages); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
- Como este POST está recebendo apenas uma ou mais imagem enviadas pelo botão adicionar, então este vetor successImage só vai ter estas imagens.
- Assim, se no POST anterior, a sessão já tinha uma imagem armazenada, a linha a seguir está substituindo o vetor anterior pelo atual, ou seja, com as imagens do POST corrente.
- Por isso, o JSP está apresentado sempre as imagens enviadas no Adicionar corrente.
- Lembre, o usuário pode usar esta página escolhendo uma imagem por vez, também. Para cada imagem, ele clica em adicionar. Então, estas imagens precisam ser acumuladas na sessão e apresentadas como thumbnails.
| sessionDTO.setImageSession((String)data.get("url")); | ||
| log.debug("Passo 5 {}", sessionDTO); | ||
| if (!invalidImages.isEmpty()) | ||
| redirectAttributes.addFlashAttribute("errors", invalidImages); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
- Inclua o vetor de imagens que já estão na sessão também no escopo de flash. Assim, o código fica mais legível e o JSP vai apresentar os thumbnails de acordo com a lista de URLs que estão neste atributo no escopo de flash.
- Lembre que o escopo de flash guarda temporariamente na sessão, usado em redirecionamentos, quando uma nova requisição é criada no redirect.
| public String saveFormImagePath(HttpSession httpSession, RedirectAttributes redirectAttributes, JobRequestDTO dto, Model model) throws IOException { | ||
| try { | ||
| if (dto.images.get(0).getOriginalFilename().equals("")) { | ||
| redirectAttributes.addFlashAttribute("errors", "Nenhuma imagem enviada."); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
- Quando é erro, faça um encaminhamento.
- Assim, o formulário continua preenchido e mesmo que ele dê F5, cairá no mesmo erro.
- Só quando o POST é sucesso é que se faz redirecionamento.
|
|
||
| sessionDTO.setImageSession((String)data.get("url")); | ||
| log.debug("Passo 5 {}", sessionDTO); | ||
| if (!invalidImages.isEmpty()) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
- Como boa prática, trate os erros no início do método.
- Geralmente, não usamos else, apenas if
- Então, se houver um erro, isto é verificado no if e se entrar nele, faz o encaminhamento para a página que vai mostrar o erro.
- Isso evita o uso do else, deixa o código mais difícil de ler.
- Com os tratamentos de erro no início com o uso do encaminhamento, todo o código que estiver abaixo destes ifs de validação, poderão executar com segurança, ou seja, os dados já foram validados.
| sessionDTO.setClientConfirmation(true); | ||
| sessionDTO.setDateCreated(DateUtil.getToday()); | ||
| sessionDTO.setStatus("Requerido"); | ||
| sessionDTO.setStatus("AVAILABLE"); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
- Usar o enum AVAILABLE
- public class JobRequest {
/**- AVAILABLE: disponível para candidaturas e permanece neste estado também durante o recebimento de candidaturas
- BUDGET: passa para este estado quando alcançado o total de candidaturas esperado ou quando o cliente encerra o recebimento de candidaturas
- TO_DO: o profissional foi escolhido para fazer o serviço e o serviço ainda não foi realizado
- CLOSED: o serviço foi realizado
*/
public enum Status {
AVAILABLE, BUDGET, TO_DO, CLOSED
};
No description provided.