小编典典

以编程方式将图像保存到 Django ImageField

all

好的,我已经尝试了几乎所有的东西,但我无法让它工作。

  • 我有一个带有 ImageField 的 Django 模型
  • 我有通过 HTTP 下载图像的代码(经过测试并且有效)
  • 图像直接保存到“upload_to”文件夹中(upload_to 是在 ImageField 上设置的那个)
  • 我需要做的就是将已经存在的图像文件路径与 ImageField

我已经用 6 种不同的方式编写了这段代码。

我遇到的问题是我正在编写的所有代码都会导致以下行为:(1)Django 将创建第二个文件,(2)重命名新文件,在文件末尾添加一个
_名称,然后(3)不传输任何数据,而将其基本上保留为一个空的重命名文件。’upload_to’ 路径中剩下 2
个文件,一个是实际图像,一个是图像名称,但为空,当然 ImageField 路径设置为 Django 尝试创建的空文件.

如果不清楚,我将尝试说明:

## Image generation code runs.... 
/Upload
     generated_image.jpg     4kb

## Attempt to set the ImageField path...
/Upload
     generated_image.jpg     4kb
     generated_image_.jpg    0kb

ImageField.Path = /Upload/generated_image_.jpg

如果没有 Django 尝试重新存储文件,我怎么能做到这一点?我真正想要的是这种效果......

model.ImageField.path = generated_image_path

…但当然这不起作用。

是的,我已经在这里解决了其他问题,例如这个问题以及File上的 django
doc

更新 经过进一步测试,它仅在 Windows Server 上的 Apache 下运行时才会出现此行为。在 XP
上的“runserver”下运行时,它不会执行此行为。

我难住了。

这是在XP上成功运行的代码…

f = open(thumb_path, 'r')
model.thumbnail = File(f)
model.save()

阅读 68

收藏
2022-06-02

共1个答案

小编典典

我有一些代码可以从网上获取图像并将其存储在模型中。重要的位是:

from django.core.files import File  # you need this somewhere
import urllib


# The following actually resides in a method of my model

result = urllib.urlretrieve(image_url) # image_url is a URL to an image

# self.photo is the ImageField
self.photo.save(
    os.path.basename(self.url),
    File(open(result[0], 'rb'))
    )

self.save()

这有点令人困惑,因为它已从我的模型中提取出来并且有点脱离上下文,但重要的部分是:

  • 从网上提取的图像 存储在 upload_to 文件夹中,而是通过 urllib.urlretrieve() 存储为临时文件,然后被丢弃。
  • ImageField.save() 方法接受一个文件名(os.path.basename 位)和一个 django.core.files.File 对象。

如果您有任何问题或需要澄清,请告诉我。

编辑:为了清楚起见,这里是模型(减去任何必需的导入语句):

class CachedImage(models.Model):
    url = models.CharField(max_length=255, unique=True)
    photo = models.ImageField(upload_to=photo_path, blank=True)

    def cache(self):
        """Store image locally if we have a URL"""

        if self.url and not self.photo:
            result = urllib.urlretrieve(self.url)
            self.photo.save(
                    os.path.basename(self.url),
                    File(open(result[0], 'rb'))
                    )
            self.save()
2022-06-02