【问题标题】:How download image from URL to django? [closed]如何将图像从 URL 下载到 django? [关闭]
【发布时间】:2020-10-08 13:38:07
【问题描述】:

我想通过 URL 加载图像,但只有 URL 本身保存到模型中,如何指定保存到媒体文件夹的路径,以及如何保存?

from django.db import models
import urllib.request
from urllib.parse import urlparse

upload_path = 'media/'

class Image(models.Model):
    image = models.ImageField(upload_to=upload_path, null= True, blank=True)
    image_url = models.URLField(blank=True, null=True)

    def get_image(self):
        name = urlparse(str(self.image)).path.split('/')[-1]
        urllib.request.urlretrieve(str(self.image_url), 'img\media\media' + name + '.jpg')

【问题讨论】:

  • 不,不仅将 URL 保存到模型中。 ImageField 保存 文件路径,并将对象保存在 MEDIA_ROOT 中。但是,这确实行不通,因为您基本上要求下载一个已经在 in 您的媒体目录中的文件。
  • @messageman 上传代码截图通常是不好的。相反,您应该将代码复制/粘贴到问题中。在前面使用 4 个空格使其格式为代码。这将允许搜索引擎根据代码进行索引,并允许其他人复制/粘贴您的代码。请更新您的问题
  • 函数的签名看起来不正常。通常它应该接受一个参数url,指定从where 获取项目。通过使用image.url,您可以获得已经存在的图像的网址(如果存在),因此在最好的情况下,您可以从自己的网络服务器下载图像。
  • @J'e 上传到 pastebin
  • @WillemVanOnsem 那我该怎么办?你能告诉我吗?

标签: python python-3.x django django-models django-forms


【解决方案1】:

您可以下载给定 URL 的图像,然后通过NamedTemporaryFile 上传:

from urllib.request import urlopen
from django.core.files import File
from django.core.files.temp import NamedTemporaryFile

class ObjectWithImageField(models.Model):
    image = models.ImageField(upload_to=upload_path, null= True, blank=True)
    image_url = models.URLField(blank=True, null=True)
    
    def get_image_from_url(self, url):
       img_tmp = NamedTemporaryFile(delete=True)
       with urlopen(url) as uo:
           assert uo.status == 200
           img_tmp.write(uo.read())
           img_tmp.flush()
       img = File(img_tmp)
       self.image.save(img_tmp.name, img)
       self.image_url = url

然后您可以使用以下方法制作图像:

my_obj = ObjectWithImageField()
my_obj.get_image_from_url('http://i.stack.imgur.com/PIFN0.jpg')
my_obj.save()

【讨论】:

    猜你喜欢
    • 2012-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-24
    • 2014-09-07
    • 1970-01-01
    • 1970-01-01
    • 2017-08-13
    相关资源
    最近更新 更多