我看到所有这些帖子都谈到'如何限制Django的imagefield只接受某些文件类型',但我还没有找到Django的imagefield支持/默认不支持的所有文件类型的列表。 / p>
是否存在Django的imagefield支持/默认不支持的文件类型列表?或者Django的imagefield是否允许提交任何文件类型?
(django会允许用户在图片领域上传.pdf,.psd,.doc等文件,还是会引发错误?)
答案 0 :(得分:3)
我的回答年度: 2020
我本人也深陷于同样的问题,并且遇到了一些我认为自己会分享的经验。
在django.core.validators
中存在一个名为get_available_image_extensions()
的函数。试试看。
from django.core import validators as v
v.get_available_image_extensions()
返回:
['blp', 'bmp', 'dib', 'bufr', 'cur', 'pcx', 'dcx', 'dds', 'ps', 'eps', 'fit',
'fits', 'fli', 'flc', 'ftc', 'ftu', 'gbr', 'gif', 'grib', 'h5', 'hdf', 'png',
'apng', 'jp2', 'j2k', 'jpc', 'jpf', 'jpx', 'j2c', 'icns', 'ico', 'im', 'iim',
'tif', 'tiff', 'jfif', 'jpe', 'jpg', 'jpeg', 'mpg', 'mpeg', 'mpo', 'msp',
'palm', 'pcd', 'pdf', 'pxr', 'pbm', 'pgm', 'ppm', 'pnm', 'psd', 'bw', 'rgb',
'rgba', 'sgi', 'ras', 'tga', 'icb', 'vda', 'vst', 'webp', 'wmf', 'emf', 'xbm',
'xpm']
该函数本身尝试使用PIL
。这就是它的全部荣耀:
def get_available_image_extensions():
try:
from PIL import Image
except ImportError:
return []
else:
Image.init()
return [ext.lower()[1:] for ext in Image.EXTENSION]
相关函数validate_image_file_extension(value)使用get_available_image_extensions()
来确定allowed_extensions
关键字参数。
这里的功能是:
def validate_image_file_extension(value):
return FileExtensionValidator(allowed_extensions=get_available_image_extensions())(value)
希望这能回答以下问题:
是否存在Django的imagefield支持的文件类型列表/ 默认情况下不支持?
答案 1 :(得分:2)
Django' ImageField
需要第三方软件包Pillow(或PIL,但不支持支持)。它依赖于这些包来验证文件确实是一个图像。这不取决于文件扩展名,而是取决于文件本身的内容。
如果您想知道某种类型的文件是否受支持,您应该找出您正在使用的Pillow / PIL版本,并查看相应的文档。
答案 2 :(得分:1)
在编写Django应用程序以上传图像时遇到了同样的问题。尝试上传DNG照片时出现表格错误。错误文字为:
Allowed extensions are: 'bmp, dib, gif, tif, tiff, jfif, jpe, jpg, jpeg, pbm,
pgm, ppm, pnm, png, apng, blp, bufr, cur, pcx, dcx, dds, ps, eps, fit, fits, fli, flc,
fpx, ftc, ftu, gbr, grib, h5, hdf, icns, ico, im, iim, jp2, j2k, jpc, jpf, jpx, j2c,
mic, mpg, mpeg, mpo, msp, palm, pcd, pdf, pxr, psd, bw, rgb, rgba, sgi, ras, tga, icb,
vda, vst, webp, wmf, emf, xbm, xpm'
在阅读了SO并进行了更深入的研究之后,我发现Pillow的文档涉及图像文件格式here(版本3.0.0)。
看来错误文本只是Pillow以及Django支持的文件类型的列表。如果他们列出了不支持的格式,那就太好了。
要解决需要上传不支持的格式的问题,我只使用了FileField
,并且在查看功能中,应用程序检查了文件扩展名,以确保它适合我定义的扩展名列表(包括DNG)。