如何将图片上传为网址,而不是文件?

时间:2019-04-14 11:39:23

标签: django django-rest-framework

我想通过带有有效负载(例如{"image_url":"http://example.com/1.jpg"})的put调用而不是从文件而是从用户提交的url上传图像。

使用DRF进行此操作的推荐方法是什么?

(到目前为止,我唯一的选择是在模型视图集中手动重新实现所有功能。还有其他更好的解决方案吗?)

更新:

我的序列化器是:

class Person(models.Model):
    image = models.ImageField() #...

class PersonSerializer(serializers.ModelSerializer):
    image = serializers.ImageField(required=False)
    class Meta:
        model = Person
        fields = ('image',)

2 个答案:

答案 0 :(得分:0)

实际上需要将图像下载到服务器吗?您不仅可以将URL保存在CharField中,然后将其传递给客户端以供其浏览器下载吗? <img src="{{ your_model.image_url }}>"。这样做可以节省服务器上的大量存储空间,并减轻此过程所需的许多安全检查,其中包括确保映像不会太大! 用户可以提供100GB的图像,这可能会使服务器崩溃。通过从Web URL下载图像并自己提供服务,您可以有效地托管已经在其他地方托管的图像。 / p>

但是,如果您希望下载图像,请使用基于python的HTTP请求库来下载图像。然后在模型中使用ImageField处理图像的存储和调用。 https://docs.djangoproject.com/en/dev/ref/models/fields/#imagefield

如果希望手动执行存储,则可以将文件保存在服务器上的文件夹中,然后在CharField中保存指向该文件的链接。尽管据我所知,这实际上是ImageField为您所做的。

答案 1 :(得分:0)

好吧,我最终要做的是在序列化时使用URLField

class Person(models.Model):
    image = models.ImageField()  

class PersonSerializer(serializers.ModelSerializer):
    image = serializers.URLField()  
    # with a custom field serializer it is possible 
    # to make this field behave both as URLField (handling links)
    # and as ImageField (handling files)
    class Meta:
        model = Person
        fields = ('image',)

    def save(self):
        # handles the upload if the image url is external.