3
respostas

dowload

bom dia, tem como fazer o dowload do arquivo que está salvo no aws? eu fiz esta pergunta em um curso anterior mas as coisas mudaram. eu preciso somente fazer o dowload de um arquivo que esta salvo no aws. Como fazer?

att

3 respostas

Oii, Patricia. Tudo bem?

Para fazer o download de um arquivo que está armazenado no S3 usando Django, você pode utilizar a biblioteca boto3, que já deve estar instalada e configurada no seu projeto, considerando que você está usando o S3Boto3Storage para o armazenamento de arquivos.

Vou deixar aqui um exemplo de como você pode fazer isso:

  • Primeiro, é importante ter as credenciais da AWS (a AWS_ACCESS_KEY_ID e a AWS_SECRET_ACCESS_KEY) configuradas direitinho no seu settings.py.

  • Você pode criar uma view no Django para lidar com o download dos arquivos. Aqui está um exemplo de como essa view pode ser implementada:

import boto3
from django.conf import settings
from django.http import HttpResponse

def download_file(request, file_name):
    # Configura o cliente S3
    s3 = boto3.client(
        's3',
        aws_access_key_id=settings.AWS_ACCESS_KEY_ID,
        aws_secret_access_key=settings.AWS_SECRET_ACCESS_KEY,
        region_name='sua-região-aws'
    )

    # Define o nome do bucket
    bucket_name = 'nome-do-seu-bucket'

    # Cria um objeto S3
    file_obj = s3.get_object(Bucket=bucket_name, Key=file_name)

    # Lê o conteúdo do arquivo
    file_content = file_obj['Body'].read()

    # Cria uma resposta HTTP com o conteúdo do arquivo
    response = HttpResponse(file_content, content_type='application/octet-stream')
    response['Content-Disposition'] = 'attachment; filename="%s"' % file_name

    return response
  • Não se esqueça de adicionar a URL correspondente no seu urls.py para que a view possa ser acessada. Por exemplo:
from django.urls import path
from .views import download_file

urlpatterns = [
    path('download/<str:file_name>/', download_file, name='download_file'),
]
  • Agora, você pode acessar a URL /download/nome-do-arquivo.extensão para baixar o arquivo desejado.

E, claro, substitua 'sua-região-aws', 'nome-do-seu-bucket' e 'nome-do-arquivo.extensão' pelos valores correspondentes ao seu ambiente AWS e ao arquivo que você deseja baixar.

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

Abraços e bons estudos!

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

Oi bom dia. Preciso de mais ajuda. essa aplicacao que estou criando servira para que os usuarios façam o upload do arquivo e dowload futuramente. entao eu gostaria de fazer as configurações sem colocar o nome de um arquivo especifico. tem como fazer salvar pelo id do models? que dai da para fazer o dowload e a exclusao automatica. minhas configuracoes estao assim:

models:

class Documento1(models.Model): file = models.FileField(upload_to="files/%Y/%m/%d/", blank=False)

views:

def pop1(request): documento1 = Documento1.objects.order_by('id') form = Documento1Form() if request.method == 'POST': form = Documento1Form(request.POST, request.FILES) if form.is_valid(): form.save() messages.success(request, 'Novo arquivo cadastrado!') return redirect('pop1')

return render(request, 'pop1/pop1.html', {'form': form, 'Documento1s': documento1})

def excluir_documento1(request, id): cadastro = get_object_or_404(Documento1, pk=id) cadastro.delete() messages.success(request, 'Item excluído com sucesso') return redirect('pop1')

def download_file(request, file_name): # Configura o cliente S3 s3 = boto3.client( 's3', aws_access_key_id=settings.AWS_ACCESS_KEY_ID, aws_secret_access_key=settings.AWS_SECRET_ACCESS_KEY, region_name='sa-east-1' )

# Define o nome do bucket
bucket_name = 'files-teste-paty'

# Cria um objeto S3
file_obj = s3.get_object(Bucket=bucket_name, Key=file_name)

# Lê o conteúdo do arquivo
file_content = file_obj['Body'].read()

# Cria uma resposta HTTP com o conteúdo do arquivo
response = HttpResponse(file_content, content_type='application/octet-stream')
response['Content-Disposition'] = 'attachment; filename="%s"' % file_name

return response

urls:

  path('download/<str:file_name>/', download_file, name='download_file'),
  path('excluir_documento1/<int:id>/', excluir_documento1, name='excluir_documento1'),

por favor me ajude

Oi, Patricia.

Vou deixar aqui algumas recomendações, mas lembrando que como não possuo acesso à sua aplicação, não posso ajudar com tanta assertividade, tá bem?

  • Você pode modificar dentro do models.FileFind. Substitua o upload_to por um nome de arquivo baseado no ID do modelo. Por exemplo, assim:
file = models.FileField(name='file/%Y/%m/%d/%(id)s', blank=False)
  • Ajustar a view pop1. O código seria parecido com isto:
def pop1(request):
    # ... (código anterior)

    if form.is_valid():
        documento1 = form.save()
        file_name = documento1.file.name  # Obter o nome do arquivo salvo

        # ... (código restante)
  • Modificar a view download_file e obter o nome do arquivo usando o ID do modelo, seria algo assim:
def download_file(request, id):
    # ... (código S3)

    # Obter o nome do arquivo do objeto com base no ID
    documento1 = get_object_or_404(Documento1, pk=id)
    file_name = documento1.file.name

    # ... (resto do código)
  • E, por fim, atualizar a url do download. Bastar Substituir a file_name pelo id do modelo na URL. Um exemplo seria assim:
path('download/<int:id>/', download_file, name='download_file'),

Lembrando, novamente, que como é uma aplicação fora do escopo do curso, é um pouco mais difícil para te ajudar. Que tal dar um pulinho no nosso Discord? Por lá você conhece mais gente e consegue compartilhar seus códigos também :)

Abraços e bons estudos!

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