如何上传图片为url,而不是文件?

问题描述 投票:0回答:2

我想上传的图片不是来自文件,而是来自用户提交的网址,通过使用{"image_url":"http://example.com/1.jpg"}等有效负载的put调用。

使用DRF建议的方法是什么?

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

更新:

我的序列化器是:

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

class PersonSerializer(serializers.ModelSerializer):
    image = serializers.ImageField(required=False)
    class Meta:
        model = Person
        fields = ('image',)
django django-rest-framework
2个回答
0
投票

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

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

如果您希望手动执行存储,可以将文件保存在服务器上的文件夹中,然后在CharField中保存指向此文件的链接。虽然据我所知,这基本上是ImageField为你做的事情。


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.
© www.soinside.com 2019 - 2024. All rights reserved.