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
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!