Кодирование поля ImageField в base64 и хранение его в БД вместо пути к изображению
settings.py
STATIC_URL = '/static/'
STATICFILES_DIRS= [str(BASE_DIR.joinpath('static'))]
STATIC_ROOT = BASE_DIR.joinpath('staticfiles')
MEDIA_URL = '/media/'
MEDIA_ROOT = str(BASE_DIR.joinpath('media'))
config/urls.py
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('proj.urls')),
] += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
models.py
class Book(models.Model):
image = models.ImageField(upload_to='upload/', blank=True, default=None, null=True)
views.py
class BookCreateView(CreateView):
model = Book
template_name = "book_new.html"
fields = "__all__"
book_new.html
{% extends 'base.html' %}
{% block content %}
<h1>New Book</h1>
<form action="" method="post" enctype="multipart/form-data">{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Save">
</form>
{% endblock content %}
proj/urls.py
urlpatterns = [
path("", home_view, name="home"),
path("book/new/", BookCreateView.as_view(), name="book_new"),
]
Я написал код, который загружает изображение в /media/upload/ и путь к файлу сохраняется в базе данных как upload/image_file.png. Я не хочу хранить путь к файлу в базе данных, я хочу прочитать файл, преобразовать его в base64 и сохранить закодированную строку в базе данных. Как я могу это сделать? Я много искал и пытался разобраться в этом самостоятельно, как я обычно делаю, но это немного сложно для меня, вот что я прочитал до сих пор:
- Отображение двоичного изображения в шаблоне Django .
- Сохранение изображения base64 в поле файла django
- Сохранение декодированного временного изображения в поле Django Imagefield
- StringIO-подобный класс, расширяющий django.core.files.File
- Django: использование base64 для хранения изображений в БД
- Кодирование Base64 Django ImageField Stream
- https://medium.com/@omaraamir19966/image-handling-with-django-de4f85a0e907
- https://idiomaticprogrammers.com/post/how-to-save-base64-encoded-image-to-django-imagefield/ .
- https://stackabuse.com/encoding-and-decoding-base64-strings-in-python/
ImageField, что касается базы данных, является простым VARCHAR(100). это означает, что вы можете хранить в нем только до 100 символов. Большая часть "магии" ImageField заключается в том, что он предоставляет интерфейс для хранения файла в MEDIA_ROOT с определенными путями и предоставляет инструменты для его повторного извлечения. Он также предоставляет инструменты для хранения высоты и ширины изображения.
Если вы действительно хотите хранить двоичные файлы в базе данных, вам придется создать свою собственную систему, используя BinaryField или что-то подобное. Помните, что вам, вероятно, также потребуется хранить некоторую мета информацию, такую как имя файла или mimetype (поскольку необработанные двоичные файлы не будут иметь этого).
В большинстве случаев хранение двоичных файлов в базе данных обычно не является лучшим решением, так как это будет медленнее, чем просто получение файлов из файловой системы. Если вы хотите, чтобы файлы были доступны между машинами, то лучше использовать сетевое монтирование или что-то вроде AWS S3.