如何在没有子目录的情况下将图像上传到Django媒体

时间:2013-06-10 17:47:56

标签: django python-2.7 django-models django-file-upload

我需要将图像上传到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)

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

1 个答案:

答案 0 :(得分:0)

原来我的早期尝试(生成_1,_2等)的错误中有一个非常大的线索

如果我指定一个只返回filename参数的upload_to callable,那么图像将直接保存在MEDIA_ROOT中,并在数据库中保存正确的文件名(没有目录前缀)。

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