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

时间:2015-08-10 21:18:02

标签: python django post django-views django-rest-framework

我正在使用Django Rest Framework的API,我需要在我的数据库中存储图像的完整URL。我认为以这种方式通过json发送它是最容易的。

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

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

在我的模型中,我有这个:

photo_url = models.URLField(null=True)

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

1 个答案:

答案 0 :(得分:0)

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

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或域。