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
Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!
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
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
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'),
]
/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!
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?
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)
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)
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)
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!