(1)为应用添加storage服务,并创建一个domain。
(2)修改models 中的ImageField,需要重写ImageField的save方法。如下:
-
from django.db import models
-
from django.db.models.fields.files import ImageFieldFile,FieldFile,FileField,ImageFile
-
import sae.storage
-
class SAEFieldFile(FieldFile):
-
def getUploadTo(self):
-
return self.upload_to
-
def save(self, name, content, save=True):
-
name = self.field.generate_filename(self.instance, name)
-
#for SAE
-
s = sae.storage.Client()
-
ob = sae.storage.Object(content._get_file().read())
-
url =s.put('media', name, ob)
-
self.name = name
-
setattr(self.instance, self.field.name, self.name)
-
# Update the filesize cache
-
self._size = content.size
-
self._committed = True
-
# Save the object because it has changed, unless save is False
-
#if save:
-
# self.instance.save()
-
class SAEImageFieldFile(ImageFile, SAEFieldFile):
-
def delete(self, save=True):
-
# Clear the image dimensions cache
-
if hasattr(self, '_dimensions_cache'):
-
del self._dimensions_cache
-
super(ImageFieldFile, self).delete(save)
-
class ZGImageFieldFile(SAEImageFieldFile):
-
def save(self, name, content, save=True):
-
super(SAEImageFieldFile, self).save(name, content, save=True)
-
class ZGImageField(models.ImageField):
-
attr_class = ZGImageFieldFile
-
def __init__(self, verbose_name=None, name=None, width_field=None, height_field=None, **kwargs):
-
super(ZGImageField, self).__init__(verbose_name, name, **kwargs)
将以上文件放到你的apps/file.py 中
说明: SAE系统,不支持本地文件的上传(也就是网站代码所在目录不支持写操作), 上传的东西, 必须放到 storage这个地方, 它是一个分布式的系统, 支持大数据量的访问。
而django中, 对于上传的写操作, 依赖于models自带的save()方法(有兴趣的可以看看save的源码), 我们在定义一个ImageField这样的属性的时候, save()就自动包含了保存到本地文件系统的能力, 问题是默认save是保存到代码所在的文件系统的,sae是要求保存到别的地方的, 需要我们重新save方法, 使得上传的东西可以保存在storage这里。 以上代码就是重写的部分 其次, 在你的models.py中, 就可以调用重写后的上传模型了。
-
from pythonpie.apps.files import ZGImageField
-
class TT(models.Model):
-
#image = ImageField(upload='./media')
-
image = ZGImageField(upload='./media')
-
这样就可以了, 在前端页面的显示,需要考虑到 URL全路径, 可以查看admin获取