将图像存储在/media/中,并将URL保存在DB中

2024-04-19 06:07:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我在一个使用Django-Rest框架的API中工作,我需要在数据库中存储图像的完整URL。我认为用这种方式最容易通过json发送它。在

我收到邮寄请求的图像。我正在使用RESTfull工具客户端进行测试,在视图post方法中得到如下内容:

<InMemoryUploadedFile: profile_1.jpg (image/jpeg)>

在我的模型中我有这样一个:

^{pr2}$

我最初的想法是将其存储在外部服务器中并存储url,但现在我需要将图像存储在我自己的服务器中,但只在db中存储url。我怎样才能做到这一点?谢谢!在


Tags: 工具django图像服务器框架视图restapi
1条回答
网友
1楼 · 发布于 2024-04-19 06:07:08

我通过以下方式实现了这一点:

def get_encoded_image(encoded_image=None):

    """
    Save the received in request base64 encoded image and return the image path to serve.
    """

    _file = str(encoded_image)
    _file = base64.b64decode(_file)
    path = default_storage.save('{folder}/{file_name}.{extension}'.format(folder=settings.DEFAULT_PROFILE_IMAGES_FOLDER,
                                                                          file_name=time.time().__str__(),
                                                                          extension='jpg'),

                                ContentFile(_file))
    if settings.DEBUG:
        image_url = urljoin(settings.DEV_DOMAIN, '{media}{path}'.format(media=settings.MEDIA_URL,
                                                                        path=path))
    else:
        image_url = urljoin(settings.DOMAIN, '{media}{path}'.format(media=settings.MEDIA_URL,
                                                                    path=path))
    return image_url

我在POST请求中收到了用base64编码的图像。我使用.time模块来获得一个唯一的名称,但是如果有另一个同名的,Django会在文件名的末尾添加一个散列。在

注意以下变量:

  • DEFAULT_PROFILE_IMAGES_FOLDER:存储图像的文件夹的名称(在media文件夹中)。在
  • DEBUG:Django的调试变量。在
  • DEV_DOMAIN:在我的例子中,这是我的http://localhost:8000
  • DOMAIN:运行应用程序的服务器的IP或域。在

相关问题 更多 >