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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何上传图片为url,而不是文件?相关的知识,希望对你有一定的参考价值。

我想上传的图片不是来自文件,而是来自用户提交的网址,通过使用{"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',)
答案

图像是否确实需要下载到服务器?您是否可以将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为你做的事情。

另一答案

好吧,我最终做的是在序列化中使用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.

以上是关于如何上传图片为url,而不是文件?的主要内容,如果未能解决你的问题,请参考以下文章

图片 url 下载图片而不是显示它

Django_上传图片和模版获取图片

根据图片的url地址下载图片到本地保存代码片段

获取上传图片的像素大小

如何将CKeditor编辑器的上传和thinkphp结合

如何将 Firebase 上传图片的图片下载 URL 转换为 base64