Google App Engine上的Django:无法上传图片

时间:2013-04-15 11:35:27

标签: django google-app-engine

我正在尝试在我的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作为库。

我可能错过了一些基本的东西,但是目前对于造成这种情况的原因一无所知......

1 个答案:

答案 0 :(得分:4)

是的,我认为你遗漏了一些非常基本的东西。您无法访问Google App Engine上的文件系统,因此os.makedirs()将无效。如果您要上传图片(或一般文件),则必须将其存储在Blobstore或Google云端存储中。在做任何其他事情之前,我建议您浏览Blobstore Python API Overview,在那里您可以看到有关如何上传文件的完整工作示例。

此外,如果您将图片上传为blob,则可以通过blob_key通过get_serving_url()获取图片投放网址。使用此URL,您可以请求特定图像的任何大小,甚至可以在服务器端裁剪,而无需任何额外的努力。