我正在尝试在我的Django应用程序中为模型实现ImageField。该应用在Google App Engine上运行。但是在上传(本地计算机,使用GAE SDK 1.7.7)后,我得到[Errno 78] Function not implemented
。
错误源自os.makedirs()
中对django.core.files.storage.FileSystemStorage._save()
的调用;调用makedirs
的参数是:
u'/Users/.../PycharmProjects/myproject/media/uploaded
MEDIA_ROOT
中的SETTINGS.PY
条目包含:
/Users/.../PycharmProjects/myproject/media/
MEDIA_URL
中的SETTINGS.PY
条目包含:
/media/
媒体目录包含名为“已上传”的子目录。我检查了权限,他们需要读/写访问权限。
我的ImageField的字段定义是:
image = models.ImageField(upload_to = "uploaded/"
由于某种原因,Django想要创建已经存在的目录。使用Django控制台os.path.exists(u'path/to/media/upload')
返回True(这是正确的)所以我不明白为什么Django想要创建目录。
此外,我使用Google Cloud SQL进行存储,并安装PILLOW进行图像处理。我还在我的app.yaml
中添加了PIL作为库。
我可能错过了一些基本的东西,但是目前对于造成这种情况的原因一无所知......
答案 0 :(得分:4)
是的,我认为你遗漏了一些非常基本的东西。您无法访问Google App Engine上的文件系统,因此os.makedirs()
将无效。如果您要上传图片(或一般文件),则必须将其存储在Blobstore或Google云端存储中。在做任何其他事情之前,我建议您浏览Blobstore Python API Overview,在那里您可以看到有关如何上传文件的完整工作示例。
此外,如果您将图片上传为blob,则可以通过blob_key
通过get_serving_url()
获取图片投放网址。使用此URL,您可以请求特定图像的任何大小,甚至可以在服务器端裁剪,而无需任何额外的努力。