上传图片解析:

SAE的设置指引如下:

处理用户上传文件

在setttings.py中添加以下配置。

  1. # 修改上传时文件在内存中可以存放的最大size为10m
  2. FILE_UPLOAD_MAX_MEMORY_SIZE = 10485760
  3.  
  4. # sae的本地文件系统是只读的,修改django的file storage backend为Storage
  5. DEFAULT_FILE_STORAGE = 'sae.ext.django.storage.backend.Storage'
  6. # 使用media这个bucket
  7. STORAGE_BUCKET_NAME = 'media'
  8. # ref: https://docs.djangoproject.com/en/dev/topics/files/

分两种情况:

  • 图片是数据库中的一个字段,比如说:
  1. class Picture(models.Model):
  2. """docstring for Picture"""
  3. user = models.ForeignKey(Customer)
  4. image = ThumbnailImageField(upload_to='goods_photo')

然后你只需要在视图函数里面这么写就ok了,这时候SAE是可以自动帮你帮图片上传到storage中的domain为media下的goods_photo文件夹下了(记得在SAE上激活storage并建立一个名为你在settings.py设定的STORAGE_BUCKET_NAME,还有在这个domain下面建立一个名为你设定的upload_to的值的文件夹)

  1. def upload_photo(request):
  2. f = request.FILES['upload_file']
  3. name=copy.copy(f.name)
  4. p = Picture()
  5. p.image = f
  6. user_id = request.POST['user_id']
  7. user = Customer.objects.get(pk=user_id)
  8. p.user = user
  9. p.save()
  • 直接上传图片到storage

参考sea的storage的api文档,链接

下面开始做正事了
我的目标是上传一个图片并生成一个缩略图,图片是数据库的一个字段,缩略图通过该数据库的一个自定义属性thumb_url 访问这个缩略图
自定义一个ThumbnailImageField,参考代码如下
  1. # ThumbnailImageField.py
  2. from django.db.models.fields.files import ImageField,ImageFieldFile
  3. from PIL import Image
  4. def _add_thumb(s):
  5. parts = s.split(".")
  6. parts.insert(-1,"thumb")
  7. if parts[-1].lower() not in ['jpeg','jpg']:
  8. parts[-1]='jpg'
  9. return ".".join(parts)
  10. class ThumbnailImageFieldFile(ImageFieldFile):
  11. def _get_thumb_url(self):
  12. return _add_thumb(self.url)
  13. thumb_url = property(_get_thumb_url)
  14.  
  15. def save(self,name,content,save=True):
  16. super(ThumbnailImageFieldFile, self).save(name,content,save)
  17. def delete(self,save=True):
  18. super(ThumbnailImageFieldFile, self).delete(save)
  19.  
  20. class ThumbnailImageField(ImageField):
  21. """docstring for ThumbnailImageField"""
  22. attr_class = ThumbnailImageFieldFile
  23. def __init__(self,*args,**kwargs):
  24. super(ThumbnailImageField, self).__init__(*args,**kwargs)
视图函数参考如下
  1. def upload_photo(request):
  2. f = request.FILES['upload_file']
  3. name=copy.copy(f.name)
  4. p = Picture()
  5. p.image = f
  6. user_id = request.POST['user_id']
  7. user = Customer.objects.get(pk=user_id)
  8. p.user = user
  9. p.save()
  10. c = sae.storage.Connection()
  11. bucket = c.get_bucket('media')
  12. obj = bucket.get_object_contents("goods_photo/"+name)
  13. image = Image.open(StringIO(obj))
  14. image.thumbnail((90,90),Image.ANTIALIAS)
  15. imgOut = StringIO()
  16. image.save(imgOut, 'jpeg')
  17. img_data = imgOut.getvalue()
  18. bucket.put_object('goods_photo/'+_add_thumb(name), img_data)
  19. imgOut.close()

视图函数详细讲解:

  1. p.save()会消耗掉request.FILES['upload_file'],所以建议的做法是先保存这个文件到storage中,然后再从storage中把这个图片取出来进行处理
    name=copy.copy(f.name),之所以使用浅拷贝也是因为 p.save()会消耗掉request.FILES['upload_file'],直接name=f.name的话拿到的name就不知道是什么了,当然你也可以使用deepcopy,但是没必要,因为name就是一个字符串
    bucket.get_object_contents("goods_photo/"+name),seastorage不支持直接的目录结构,但可以通过文件名来模拟目录结构

django 上传图片、使用PIL制作缩略图并保存到sea的storage的更多相关文章

  1. ThinkPHP5上传图片并压缩为缩略图

    使用thinkphp开发app后端中,需要实现一个处理上传图片队列的功能 这是个上传多图片保存并且需要对其中一张图片进行压缩的功能 (使用的html5 mui框架开发app,如果直接载入原图,app客 ...

  2. C#制作简易屏保(转)

    C#制作简易屏保[原创] 原始网址: http://www.cnblogs.com/drizzlecrj/archive/2006/10/06/522182.html 2006-10-06 16:25 ...

  3. php制作缩略图

    PHP制作缩略图 1.制作缩略图的函数 imagecopyresampled(dest,src,dx,dy,sx,sy,dw,dh,sw,sh) 说明: dest 目标画布 src 原图(要缩略的图片 ...

  4. WPF 制作 Windows 屏保

    分享如何使用WPF 制作 Windows 屏保 WPF 制作 Windows 屏保 作者:驚鏵 原文链接:https://github.com/yanjinhuagood/ScreenSaver 框架 ...

  5. 爬取伯乐在线文章(四)将爬取结果保存到MySQL

    Item Pipeline 当Item在Spider中被收集之后,它将会被传递到Item Pipeline,这些Item Pipeline组件按定义的顺序处理Item. 每个Item Pipeline ...

  6. Python实现将图片以二进制格式保存到MySQL数据库中,以及取出:

    创建数据库表格式: CREATE TABLE photo ( photo_no int(6) unsigned NOT NULL auto_increment, image MEDIUMBLOB, P ...

  7. jQuery切换网页皮肤保存到Cookie实例

    效果体验:http://keleyi.com/keleyi/phtml/jqtexiao/25.htm 以下是源代码: <!DOCTYPE html PUBLIC "-//W3C//D ...

  8. 个人学习记录1:二维数组保存到cookie后再读取

    二维数组保存到cookie后再读取 var heartsArray = [[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0],[0,0, ...

  9. 利用session_set_save_handler()函数将session保存到MySQL数据库中

    PHP保存session默认的是采用的文件的方式来保存的,这仅仅在文件的空间开销很小的windows上是可以采用的,但是如果我们采用uinx或者是liux上的文件系统的时候,这样的文件系统的文件空间开 ...

随机推荐

  1. POJ2195:Going Home——题解

    http://poj.org/problem?id=2195 题目大意: 有些人和房子,一个人只能进一个房子,人走到房子的路程即为代价. 求所有人走到房子后的最小代价. ——————————————— ...

  2. POJ 2728 Desert King | 01分数规划

    题目: http://poj.org/problem?id=2728 题解: 二分比率,然后每条边边权变成w-mid*dis,用prim跑最小生成树就行 #include<cstdio> ...

  3. Linux实验一

    一.Linux 简介 1.Linux 就是一个操作系统,就像你多少已经了解的 Windows(xp,7,8)和 Max OS , 我们的 Linux 也就是系统调用和内核那两层,当然直观的来看,我们使 ...

  4. mongo日常操作备忘

    修改 普通修改 插入数据: db.students.insert({ "name":"swrd", "age":32, "grad ...

  5. im-switch -s ibus错误:Error: no configuration file "ibus" exists.

    在虚拟机上安装Ubuntu14.04 后安装ibus输入法,万万没想到在切换输入法的时候居然出错了! 无语了,再网上查了一下,这个错误出现的还是比较少的. 先说Ubuntu输入法(ibus)安装的一般 ...

  6. Rectangle 暴力枚举大法

    frog has a piece of paper divided into n rows and m columns. Today, she would like to draw a rectang ...

  7. bzoj 4069 [Apio2015]巴厘岛的雕塑 dp

    [Apio2015]巴厘岛的雕塑 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 494  Solved: 238[Submit][Status][Dis ...

  8. Linux网络监控工具nethogs

    Linux网络监控工具nethogs 标签: 监控工具linux 2015-12-17 22:06 448人阅读 评论(0) 收藏 举报  分类: linux(40)  版权声明:本文为博主原创文章, ...

  9. git 回退

    回退命令: $ git reset --hard HEAD^ 回退到上个版本$ git reset --hard HEAD~3 回退到前3次提交之前,以此类推,回退到n次提交之前 $ git rese ...

  10. Elasticsearch6.0 IKAnalysis分词使用

    Elasticsearch 内置的分词器对中文不友好,会把中文分成单个字来进行全文检索,不能达到想要的结果,在全文检索及新词发展如此快的互联网时代,IK可以进行友好的分词及自定义分词. IK Anal ...