1

我需要将图像上传到 Django ImageField,但由于基于第三方 API 的限制,我需要将图像上传到没有子目录的媒体目录。

限制是由于本地存储的文件名(在 imagefield 列中)用于计算哈希以从媒体 API 请求该图像,因此该字段必须包含与 API 中的文件名相同的名称,不幸的是API 文件名不能包含斜杠。

我无法在数据库中添加一个字段来存储真实的文件名,也无法控制返回计算哈希的代码。

我尝试使 upload_to 成为一个返回空字符串的可调用对象,这似乎绕过了 upload_to 所需的错误,但是图像都被保存为 ''(blank) _1, _2 ... etc 没有图像的其余部分姓名。

我也试过让upload_to返回'/'、'../media'、'../media/'都无济于事(各种错误或格式错误的文件名)

那么 TL;DR 如何在没有子目录的情况下将图像直接保存到 MEDIA_ROOT?

编辑,额外信息:

所以我只是尝试了一个小技巧来完成它的一部分:

from django.core.files.storage import FileSystemStorage

media_root_store = FileSystemStorage(location='/path/to/media/parent')

class MyModel(models.Model):
    img_file = models.ImageField(
        max_length=255,
        upload_to='media',
        storage=media_root_store)

这个肮脏的黑客将图像保存到正确的位置,尽管它仍然明显地保存了带有 media/ 附加的图像路径。所以我不确定它是否真的让我更接近了。

4

1 回答 1

0

事实证明,我之前的尝试中的错误中有一个很大的线索(生成_1、_2等的那个)

如果我指定一个仅返回文件名参数的 upload_to 可调用文件,则图像将直接保存在 MEDIA_ROOT 中,并在数据库中保存正确的文件名(不带目录前缀)。

我一直认为upload_to 只会提供附加到MEDIA_ROOT 的路径,然后将图像文件名附加到该路径。事实证明这是不正确的。

于 2013-06-10T18:35:04.790 回答