gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 12:19:32 29 4
gpt4 key购买 nike

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

  • 我有一个带有 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

...但是这当然行不通。

是的,我已经解决了这里的其他问题,例如 this one以及 File 上的 django 文档

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

我被难住了。

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

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

最佳答案

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

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()

关于python - 以编程方式将图像保存到 Django ImageField,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1308386/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com