Кодирование поля 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 и сохранить закодированную строку в базе данных. Как я могу это сделать? Я много искал и пытался разобраться в этом самостоятельно, как я обычно делаю, но это немного сложно для меня, вот что я прочитал до сих пор:

ImageField, что касается базы данных, является простым VARCHAR(100). это означает, что вы можете хранить в нем только до 100 символов. Большая часть "магии" ImageField заключается в том, что он предоставляет интерфейс для хранения файла в MEDIA_ROOT с определенными путями и предоставляет инструменты для его повторного извлечения. Он также предоставляет инструменты для хранения высоты и ширины изображения.

Если вы действительно хотите хранить двоичные файлы в базе данных, вам придется создать свою собственную систему, используя BinaryField или что-то подобное. Помните, что вам, вероятно, также потребуется хранить некоторую мета информацию, такую как имя файла или mimetype (поскольку необработанные двоичные файлы не будут иметь этого).

В большинстве случаев хранение двоичных файлов в базе данных обычно не является лучшим решением, так как это будет медленнее, чем просто получение файлов из файловой системы. Если вы хотите, чтобы файлы были доступны между машинами, то лучше использовать сетевое монтирование или что-то вроде AWS S3.

Вернуться на верх