2
respostas

[Dúvida] Jogoteca: ao atualizar o nome, a categoria ou o console de um jogo que já contém uma imagem, a mesma é removida da pasta de uploads

Olá,

Finalizei o curso "Flask: avançando no desenvolvimento web com Python" e estou com a Jogoteca rodando localmente.

No entanto, um bug está acontecendo: se eu atualizar qualquer uma das informações textuais de um jogo que já contém uma imagem (inserida previamente no formulário), a imagem é removida na atualização. Meu código de atualização do jogo em views_game.py é o seguinte:

@app.route('/atualizar', methods=['POST',])
# Recebe os dados do formulário e atualiza um jogo na lista
def atualizar():
    # Instancio o formulário
    form = FormularioJogo(request.form)

    # Verifica se o formulário foi validado
    if form.validate_on_submit():
        # Cria uma variável para buscar o jogo pelo id (que está sendo enviado no campo hidden do formulário)
        jogo = Jogos.query.filter_by(id=request.form['id']).first()
        # Recebe os dados do formulário
        jogo.nome = form.nome.data
        jogo.categoria = form.categoria.data
        jogo.console = form.console.data

        db.session.add(jogo)
        db.session.commit()

        # Recebo o arquivo enviado pelo formulário
        arquivo = request.files['arquivo']
        upload_path = app.config['UPLOAD_PATH']
        # Crio um timestamp para adicionar ao nome do arquivo
        timestamp = time.time()
        # Chamo uma função para deletar a imagem antiga
        deleta_arquivo(jogo.id)


        # Verifica a extensão do arquivo
        if arquivo.filename.endswith('.jpg'):
            # Faça o processamento do arquivo
            arquivo.save(f'{upload_path}/capa-{jogo.id}-{timestamp}.jpg')
        elif arquivo.filename.endswith('.png'):
            # Faça o processamento do arquivo
            arquivo.save(f'{upload_path}/capa-{jogo.id}-{timestamp}.png')
        else:
            flash('Formato de arquivo inválido. Apenas arquivos JPG e PNG são permitidos.')
            return redirect(url_for('index'))

    return redirect(url_for('index'))

Será que alguém poderia me dar uma luz sobre como verificar que o jogo já possui uma imagem e mantê-la no servidor? Desde já agradeço!

2 respostas

Acho que consegui resolver a questão. Deixo aqui a implementação, para o caso de ser útil para outras pessoas.

Em resumo, após criar as variáveis "arquivo" e "upload_path", verifico se algum arquivo foi enviado antes de chamar a função apra deletar a imagem antiga. O trecho de código ficou assim:

@app.route('/atualizar', methods=['POST',])
# Recebe os dados do formulário e atualiza um jogo na lista
def atualizar():
    # Instancio o formulário
    form = FormularioJogo(request.form)

    # Verifica se o formulário foi validado
    if form.validate_on_submit():
        # Cria uma variável para buscar o jogo pelo id (que está sendo enviado no campo hidden do formulário)
        jogo = Jogos.query.filter_by(id=request.form['id']).first()
        # Recebe os dados do formulário
        jogo.nome = form.nome.data
        jogo.categoria = form.categoria.data
        jogo.console = form.console.data

        db.session.add(jogo)
        db.session.commit()

        # Recebo o arquivo enviado pelo formulário
        arquivo = request.files['arquivo']
        upload_path = app.config['UPLOAD_PATH']
        # Verifico se o arquivo foi enviado
        if arquivo:
            # Crio um timestamp para adicionar ao nome do arquivo
            timestamp = time.time()
            # Chamo uma função para deletar a imagem antiga
            deleta_arquivo(jogo.id)


            # Verifica a extensão do arquivo
            if arquivo.filename.endswith('.jpg'):
                # Faça o processamento do arquivo
                arquivo.save(f'{upload_path}/capa-{jogo.id}-{timestamp}.jpg')
            elif arquivo.filename.endswith('.png'):
                # Faça o processamento do arquivo
                arquivo.save(f'{upload_path}/capa-{jogo.id}-{timestamp}.png')
            else:
                flash('Formato de arquivo inválido. Apenas arquivos JPG e PNG são permitidos.')
                return redirect(url_for('index'))

    return redirect(url_for('index'))

Dessa forma, eu consigo editar as informações do jogo sem alterar a imagem.

Oi, Fabiano, tudo certo contigo?

Obrigada por compartilhar conosco a sua resolução! :)

Se outra dúvida surgir, estamos disponíveis.

Abraços e bons estudos!