Загрузка изображений из ведра S3 в Django
Пытаюсь загрузить изображения с помощью кнопки загрузки, но когда я нажимаю ее, вместо загрузки изображения происходит переход на ссылку s3bucket. Ссылка, на которую она перенаправляет, - https://bucketname.s3.amazonaws.com/images/filename.jpeg. Я хочу, чтобы при нажатии на кнопку загрузки изображение загружалось на устройство пользователя, а не перенаправлялось. Вот мой основной вид галереи, который использует поисковую подсказку для поиска имен файлов + ключевых слов в моей базе данных, а затем извлекает подходящие изображения из ведра.
def gallery(request):
query = request.GET.get('q', 'free wallpapers')
s3_image_urls = []
top_search_terms = []
keywords = query.split()
conditions = []
query_params = []
for keyword in keywords:
conditions.append("description LIKE %s")
query_params.append('%' + keyword + '%')
sql_query = "SELECT image_key FROM images_table WHERE " + " AND ".join(conditions)
with connection.cursor() as cursor:
cursor.execute(sql_query, query_params)
results = cursor.fetchall()
s3_bucket_url = 'https://{}.s3.amazonaws.com/images/'.format(settings.AWS_STORAGE_BUCKET_NAME)
# Generate image URLs
for result in results:
for image_key in result:
image_url = s3_bucket_url + image_key
s3_image_urls.append(image_url)
# Log the search term into the search_logs table
with connection.cursor() as cursor:
cursor.execute("SELECT search_count FROM search_logs WHERE search_term = %s", [query])
row = cursor.fetchone()
if row:
new_count = row[0] + 1
cursor.execute("UPDATE search_logs SET search_count = %s WHERE search_term = %s", [new_count, query])
else:
# If it doesn't exist, insert a new record
cursor.execute("INSERT INTO search_logs (search_term, search_count) VALUES (%s, %s)", [query, 1])
# Fetch top 10 search terms
with connection.cursor() as cursor:
cursor.execute("SELECT search_term FROM search_logs ORDER BY search_count DESC LIMIT 10")
top_search_terms = [row[0] for row in cursor.fetchall()]
# Get the username from session
username = request.session.get('username')
# Render the gallery template with the search results and top search terms
return render(request, 'gallery.html', {
'results': s3_image_urls,
'top_search_terms': top_search_terms,
'username': username
})
в html шаблоне, где кнопка загрузки находится на каждом изображении. Кнопка загрузки перенаправляет на https://bucketname.s3.amazonaws.com/images/filename.jpeg вместо загрузки изображения. что я делаю не так.
<div class="bodyclass">
{% if results %}
<div class="grid">
{% for image_url in results %}
<div class="image-container">
<img src="{{ image_url }}" alt="Image from S3">
<div class="download-button">
<a href="{{ image_url }}" download>
<img src="{% static 'images/download.png' %}" alt="Download" class="icon">
</a>
</div>
<div class="save-button">
<img src="{% static 'images/plus.png' %}" alt="Save" class="icon">
</div>
</div>
{% endfor %}
</div>
{% else %}
<p>No results found.</p>
{% endif %}
</div>
Добавлены политики ведер и CORS-политики на aws.