我需要将图像上传到Django ImageField,但由于基于第三方API的限制,我需要将图像上传到媒体目录而不需要子目录。
限制是由于本地存储的文件名(在imagefield列中)用于计算从媒体API请求该图像的哈希,因此该字段必须包含与API中的文件名相同的名称,遗憾的是API文件名不能包含斜杠。
我无法在db中添加字段来存储真实文件名,也无法控制返回计算散列的代码。
我尝试将upload_to设为一个可调用的,返回一个空字符串,这似乎绕过了upload_to所需的错误,但是这些图像都被保存为''(空白)_1,_2 ......等等而没有其余的图像名称。
我也试过让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)
这种肮脏的黑客将图像保存到正确的位置,尽管它显然仍然保存了带有媒体/附加的图像路径。所以我不确定它是否真的让我更近了。
答案 0 :(得分:0)
原来我的早期尝试(生成_1,_2等)的错误中有一个非常大的线索
如果我指定一个只返回filename参数的upload_to callable,那么图像将直接保存在MEDIA_ROOT中,并在数据库中保存正确的文件名(没有目录前缀)。
我一直认为upload_to只会提供一个附加到MEDIA_ROOT的路径,然后将附加图像文件名。事实证明这是不正确的。