Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Imagens não ficam salvas

Problema: Eu seleciono a opção "editar", escolho uma imagem, clico em salvar, clico em editar novamente e a imagem não está lá, ou seja, não atualiza. Mostrarei as 3 imagens, onde na primeira imagem eu abro o editar, na segunda imagem eu seleciono uma imagem e salvo, e na terceira imagem eu volto pra editar e a imagem que escolhi não está mais lá

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Insira aqui a descrição dessa imagem para ajudar na acessibilidadeInsira aqui a descrição dessa imagem para ajudar na acessibilidade

Meu código do views_game.py:

from flask import render_template, request, redirect, session, flash, url_for, send_from_directory
from jogoteca import app, db
from models import Jogos
from helpers import recupera_imagem, deleta_imagem
import time
from helpers import FormularioJogo

@app.route('/')
def index():
    lista = Jogos.query.order_by(Jogos.id)
    return render_template('lista.html', titulo='Jogos', jogos=lista)

@app.route('/novo')
def novo():
    if 'usuario_logado' not in session or session['usuario_logado'] == None:
        return redirect(url_for('login', proxima=url_for('novo')))
    
    form = FormularioJogo()
    return render_template('novo.html', titulo='Novo jogo', form=form)

@app.route('/criar', methods=['POST',])
def criar():
    form = FormularioJogo(request.form)

    if not form.validate_on_submit():
        return redirect(url_for('novo'))

    nome = form.nome.data
    categoria = form.categoria.data
    console = form.console.data

    existe = Jogos.query.filter_by(nome=nome).first()

    if existe:
        flash('Jogo já existente!')
        return redirect(url_for('index'))
    
    jogo = Jogos(nome=nome, categoria=categoria, console=console)
    db.session.add(jogo)
    db.session.commit()

    arquivo = request.files['arquivo']
    upload_path = app.config['UPLOAD_PATH']
    tempo = time.time()
    arquivo.save(f'{upload_path}/capa{jogo.id}-{tempo}.jpg')
    
    return redirect(url_for('index'))

@app.route('/editar/<int:id>')
def editar(id):
    if 'usuario_logado' not in session or session['usuario_logado'] == None:
        return redirect(url_for('login', proxima=url_for('editar', id=id)))
    
    jogo = Jogos.query.filter_by(id=id).first()

    form = FormularioJogo()
    form.nome.data = jogo.nome
    form.categoria.data = jogo.categoria
    form.console.data = jogo.console

    capa_jogo = recupera_imagem(id)

    return render_template('editar.html', titulo='Editando Jogo', id=id, capa_jogo=capa_jogo, form=form)

@app.route('/atualizar', methods=['POST',])
def atualizar():
    form = FormularioJogo(request.form)

    if form.validate_on_submit():
        jogo = Jogos.query.filter_by(id=request.form['id']).first()
        jogo.nome = form.nome.data
        jogo.categoria = form.categoria.data
        jogo.console = form.console.data

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

        arquivo = request.files['arquivo']
        upload_path = app.config['UPLOAD_PATH']
        tempo = time.time()
        deleta_imagem(id)
        arquivo.save(f'{upload_path}/capa{jogo.id}-{tempo}.jpg')

    return redirect(url_for('index'))

@app.route('/deletar/<int:id>')
def deletar(id):
    if 'usuario_logado' not in session or session['usuario_logado'] == None:
        return redirect(url_for('login'))
    
    Jogos.query.filter_by(id=id).delete()

    db.session.commit()

    flash('Jogo deletado!')

    return redirect(url_for('index'))

@app.route('/uploads/<nome_arquivo>')
def imagem(nome_arquivo):
    return send_from_directory('uploads', nome_arquivo)

app.run(debug=True)

As funções de recuperar e deletar imagem no views.py:

def recupera_imagem(id):
    for nome_arquivo in os.listdir(app.config['UPLOAD_PATH']):
        if f'capa{id}' in nome_arquivo:
            return nome_arquivo
        return 'capa_padrao.jpg'
    
def deleta_imagem(id):
    imagem = recupera_imagem(id)
    if imagem != 'capa_padrao.jpg':
        os.remove(os.path.join(app.config['UPLOAD_PATH']), imagem)
2 respostas
solução!

Olá, Fernando! Como vai?

Analisando o seu código e as imagens fornecidas, parece que o problema está na função recupera_imagem. A função tem um return dentro do loop for, o que faz com que a função retorne na primeira iteração do loop, independentemente de encontrar ou não a imagem correta. Isso pode estar causando a falha ao tentar recuperar a imagem após salvá-la.

Vamos corrigir a função recupera_imagem para garantir que ela percorra todos os arquivos no diretório de upload antes de retornar a imagem padrão:

def recupera_imagem(id):
    for nome_arquivo in os.listdir(app.config['UPLOAD_PATH']):
        if f'capa{id}' in nome_arquivo:
            return nome_arquivo
    return 'capa_padrao.jpg'

Além disso, na função deleta_imagem, parece haver um erro na chamada de os.remove(). O caminho do arquivo deve ser a combinação do diretório de upload e o nome do arquivo, mas no seu código está faltando a vírgula que separa os dois argumentos na função os.path.join(). Corrija essa linha para:

os.remove(os.path.join(app.config['UPLOAD_PATH'], imagem))

Após essas correções, tente novamente salvar e editar as imagens para ver se o problema foi resolvido. Se persistir, verifique se as imagens estão sendo efetivamente salvas no diretório especificado e se o nome do arquivo está correto, e por último caso, compartilhe todo o seu projeto, usando GitHub ou Drive do Google, para que eu realize testes.

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.

Nossa Senhora, fico surpreso com sua analise desses detalhes que passaram totalmente despercebidos por mim, principalmente a virgula do os.remove(). Deu tudo certo agora, obrigadao!!