我正在尝试为我的 Django 应用程序中的模型实现一个 ImageField。该应用程序在 Google App Engine 上运行。但是在上传时(本地机器,使用 GAE SDK 1.7.7)我得到一个[Errno 78] Function not implemented
。
错误源于django.core.files.storage.FileSystemStorage._save()
中对os.makedirs()
的调用;调用 makedirs
的参数是:
u'/Users/.../PycharmProjects/myproject/media/uploaded
SETTINGS.PY
中我的MEDIA_ROOT
条目包含:
/Users/.../PycharmProjects/myproject/media/
SETTINGS.PY
中我的 MEDIA_URL
条目包含:
/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 作为库。
我可能遗漏了一些基本的东西,但目前我对造成这种情况的原因一无所知......
最佳答案
是的,我认为您在这里遗漏了一些非常基本的东西。您无权访问 Google App Engine 上的文件系统,因此 os.makedirs()
将无法运行。如果您想上传图片(或一般文件),您必须将它们存储在 Blobstore 或 Google Cloud Storage 中。在做任何其他事情之前,我建议您先查看 Blobstore Python API Overview您可以在其中查看有关如何上传文件的完整示例。
此外,如果您将图像上传为 blob,您将能够通过 get_serving_url()
获取图像服务 URL。通过提供 blob_key
。使用此 URL,您可以为特定图像请求任何尺寸,甚至无需任何额外工作即可在服务器端裁剪它。
关于Google App Engine 上的 Django : cannot upload images,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16014147/