django 上传图片、使用PIL制作缩略图并保存到sea的storage
上传图片解析:
SAE的设置指引如下:
处理用户上传文件
在setttings.py中添加以下配置。
# 修改上传时文件在内存中可以存放的最大size为10m
FILE_UPLOAD_MAX_MEMORY_SIZE = 10485760 # sae的本地文件系统是只读的,修改django的file storage backend为Storage
DEFAULT_FILE_STORAGE = 'sae.ext.django.storage.backend.Storage'
# 使用media这个bucket
STORAGE_BUCKET_NAME = 'media'
# ref: https://docs.djangoproject.com/en/dev/topics/files/
分两种情况:
- 图片是数据库中的一个字段,比如说:
class Picture(models.Model):
"""docstring for Picture"""
user = models.ForeignKey(Customer)
image = ThumbnailImageField(upload_to='goods_photo')
然后你只需要在视图函数里面这么写就ok了,这时候SAE是可以自动帮你帮图片上传到storage中的domain为media下的goods_photo文件夹下了(记得在SAE上激活storage并建立一个名为你在settings.py设定的STORAGE_BUCKET_NAME,还有在这个domain下面建立一个名为你设定的upload_to的值的文件夹)
def upload_photo(request):
f = request.FILES['upload_file']
name=copy.copy(f.name)
p = Picture()
p.image = f
user_id = request.POST['user_id']
user = Customer.objects.get(pk=user_id)
p.user = user
p.save()
- 直接上传图片到storage
参考sea的storage的api文档,链接
# ThumbnailImageField.py
from django.db.models.fields.files import ImageField,ImageFieldFile
from PIL import Image
def _add_thumb(s):
parts = s.split(".")
parts.insert(-1,"thumb")
if parts[-1].lower() not in ['jpeg','jpg']:
parts[-1]='jpg'
return ".".join(parts)
class ThumbnailImageFieldFile(ImageFieldFile):
def _get_thumb_url(self):
return _add_thumb(self.url)
thumb_url = property(_get_thumb_url) def save(self,name,content,save=True):
super(ThumbnailImageFieldFile, self).save(name,content,save)
def delete(self,save=True):
super(ThumbnailImageFieldFile, self).delete(save) class ThumbnailImageField(ImageField):
"""docstring for ThumbnailImageField"""
attr_class = ThumbnailImageFieldFile
def __init__(self,*args,**kwargs):
super(ThumbnailImageField, self).__init__(*args,**kwargs)
def upload_photo(request):
f = request.FILES['upload_file']
name=copy.copy(f.name)
p = Picture()
p.image = f
user_id = request.POST['user_id']
user = Customer.objects.get(pk=user_id)
p.user = user
p.save()
c = sae.storage.Connection()
bucket = c.get_bucket('media')
obj = bucket.get_object_contents("goods_photo/"+name)
image = Image.open(StringIO(obj))
image.thumbnail((90,90),Image.ANTIALIAS)
imgOut = StringIO()
image.save(imgOut, 'jpeg')
img_data = imgOut.getvalue()
bucket.put_object('goods_photo/'+_add_thumb(name), img_data)
imgOut.close()
视图函数详细讲解:
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),sea的storage不支持直接的目录结构,但可以通过文件名来模拟目录结构
django 上传图片、使用PIL制作缩略图并保存到sea的storage的更多相关文章
- ThinkPHP5上传图片并压缩为缩略图
使用thinkphp开发app后端中,需要实现一个处理上传图片队列的功能 这是个上传多图片保存并且需要对其中一张图片进行压缩的功能 (使用的html5 mui框架开发app,如果直接载入原图,app客 ...
- C#制作简易屏保(转)
C#制作简易屏保[原创] 原始网址: http://www.cnblogs.com/drizzlecrj/archive/2006/10/06/522182.html 2006-10-06 16:25 ...
- php制作缩略图
PHP制作缩略图 1.制作缩略图的函数 imagecopyresampled(dest,src,dx,dy,sx,sy,dw,dh,sw,sh) 说明: dest 目标画布 src 原图(要缩略的图片 ...
- WPF 制作 Windows 屏保
分享如何使用WPF 制作 Windows 屏保 WPF 制作 Windows 屏保 作者:驚鏵 原文链接:https://github.com/yanjinhuagood/ScreenSaver 框架 ...
- 爬取伯乐在线文章(四)将爬取结果保存到MySQL
Item Pipeline 当Item在Spider中被收集之后,它将会被传递到Item Pipeline,这些Item Pipeline组件按定义的顺序处理Item. 每个Item Pipeline ...
- Python实现将图片以二进制格式保存到MySQL数据库中,以及取出:
创建数据库表格式: CREATE TABLE photo ( photo_no int(6) unsigned NOT NULL auto_increment, image MEDIUMBLOB, P ...
- jQuery切换网页皮肤保存到Cookie实例
效果体验:http://keleyi.com/keleyi/phtml/jqtexiao/25.htm 以下是源代码: <!DOCTYPE html PUBLIC "-//W3C//D ...
- 个人学习记录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, ...
- 利用session_set_save_handler()函数将session保存到MySQL数据库中
PHP保存session默认的是采用的文件的方式来保存的,这仅仅在文件的空间开销很小的windows上是可以采用的,但是如果我们采用uinx或者是liux上的文件系统的时候,这样的文件系统的文件空间开 ...
随机推荐
- BZOJ2938 & 洛谷2444:[POI2000]病毒——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=2938 https://www.luogu.org/problemnew/show/P2444 二进制 ...
- BZOJ3123:[SDOI2013]森林——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=3123 https://www.luogu.org/problemnew/show/P3302 树上主 ...
- Mysql数据库的主从复制
怎么安装mysql数据库,这里不说了,只说它的主从复制,步骤如下: 1.主从服务器分别作以下操作: 1.1.版本一致 1.2.初始化表,并在后台启动mysql 1.3.修改root的密码 2.修 ...
- bug report
ubuntu 11.10添加eth0:1后重启网卡不显示 eth0:1 http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=324306
- FreeRTOS ------ 栈、堆、任务栈
1.任务的栈资源(创建任务分配的资源,单位是4字节)来自 configTOTAL_HEAP_SIZE 定义的堆,如果任务栈总量超过 configTOTAL_HEAP_SIZE,任务创建失败: 2.如果 ...
- ASP.NET和ASP的区别是什么
分析: ASP与ASP.NET是Microsoft公司在Web应用程序开发上的两项重要技术. ASP与ASP.NET区别如下: (1)开发语言不同:ASP的开发语言仅局限于使用non-type脚本语言 ...
- [Luogu 2341] HAOI2006 受欢迎的牛
[Luogu 2341] HAOI2006 受欢迎的牛 智能推的水题,一看是省选题就给做了,做一半才发现 Tarjan 算法忘干净了. Tarjan 求出SCC,算出每一个 SCC 包含原图的点数(s ...
- Parallel
介绍 C# 4.0 的新特性之并行运算 Parallel.For - for 循环的并行运算 Parallel.ForEach - foreach 循环的并行运算 Parallel.Invoke - ...
- 【Foreign】画方框 [主席树]
画方框 Time Limit: 10 Sec Memory Limit: 256 MB Description Input Output 输出一行一个整数,表示 CD 最多可能画了几个方框. Sam ...
- 2、MySQL常见数据库引擎及比较?
MySQL存储引擎简介 MySQL支持数个存储引擎作为对不同表的类型的处理器.MySQL存储引擎包括处理事务安全表的引擎和处理非事务安全表的引擎: MyISAM管理非事务表.它提供高速存储和检索,以及 ...