当前位置: 首页 > 面试题库 >

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

云焱
2023-03-14
问题内容

好的,我已经尝试了几乎所有内容,但无法正常工作。

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

…但是那当然不行。

是的,我已经经历这里的其他问题,如走了这一个,以及对Django的DOC 文件

更新 经过进一步测试,仅当在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()

这有点令人困惑,因为它脱离了我的模型并且脱离了上下文,但是重要的部分是:

  • 从Web提取的图像未存储在upload_to文件夹中,而是由urllib.urlretrieve()作为临时文件存储,之后被丢弃。
  • ImageField.save()方法采用文件名(os.path.basename位)和django.core.files.File对象
    让我知道你是否有疑问或需要澄清。

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

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


 类似资料:
  • 问题内容: 我正在开发一个插件。 单击按钮时,我想调用Eclipse的save方法或调用Eclipse工具栏上的save按钮。 怎么做呢? 问题答案: 应该可以。 如果要保存活动的编辑器,请尝试 请注意,导航路径中的元素可以为null。

  • 我在寻找过去的一天,我没有成功。 我从API获取图像,并使用以下代码将其下载到位图文件。 我得到一个正方形的图像,我想裁剪四个角,使其成为圆形图像。有没有可能实现的方法? 欢迎任何相关答案。提前谢谢。

  • 问题内容: 我的Express应用程序正在从浏览器中接收base64编码的PNG(使用toDataURL()从画布生成)并将其写入文件。但是该文件不是有效的图像文件,因此“文件”实用程序只是将其标识为“数据”。 问题答案: 我认为您正在转换的数据比您需要的更多。一旦使用正确的编码创建了缓冲区,您只需要将缓冲区写入文件即可。 new Buffer(…,’base64’)通过将输入解释为base64编

  • 问题内容: 我尝试使用此代码下载图像并将其保存在以下行中: 我在emulator.my应用程序上尝试了此操作,但出现异常,没有权限保存到此路径: 我也添加了这一行: 这是代码: 问题答案: