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文档,链接

下面开始做正事了

我的目标是上传一个图片并生成一个缩略图,图片是数据库的一个字段,缩略图通过该数据库的一个自定义属性thumb_url 访问这个缩略图

自定义一个ThumbnailImageField,参考代码如下

# 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不支持直接的目录结构,但可以通过文件名来模拟目录结构
时间: 2024-12-14 09:21:13

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

asp.net上传图片并同时生成缩略图

<script language="VB" runat="server"> Sub UploadFile(sender As Object, e As EventArgs) If FileUp.PostedFile.ContentLength = 0 Then FileInfo.Visible = False Exit Sub Else FileInfo.Visible = True FDisplay1.Visible = True End If FSi

将桌面文件动态保存到D盘

问题描述:桌面文件往往有很多很重要,很容易被丢失(尤其是系统出现问题) 参考网友和度娘,整理了三中解决方式: 方式一:(修改环境变量)(未测) 1.在D盘建立一个文件夹MyDESK 2.右键桌面"我的电脑",选择"属性",在弹出的"系统属性"窗口中选高级,选择环境变量,在Administrator(自己的登录用户名)的用户变量下面点击新建,在变量名处填入userprofile,在变量值处填入D:\MyDESK,然后单击确定 3.把C:\Docum

将数字n转换为字符串并保存到s中

参考 C程序设计语言 #include <stdio.h> #include <string.h> //reverse函数: 倒置字符串s中各字符的位置 void reverse(char s[]){ int c,i,j; for(i=0,j=strlen(s)-1;i<j;i++,j--){ c=s[i], s[i]=s[j], s[j]=c; } } //itoa函数: 将数字n转换为字符串并保存到s中 void itoa(int n, char s[]){ int i,

android如何保存读取读取文件文件保存到SDcard

android如何保存读取读取文件文件保存到SDcard 19. 三 / android基础 / 没有评论 本文来源于www.ifyao.com禁止转载!www.ifyao.com 上图为保存文件的方法体. 上图为如何调用方法体保存数据. 上面的截图介绍了,文件保存的基本内容. 路径也可以更改. 将内容保存到文件介绍完毕. 本文来源于www.ifyao.com禁止转载!www.ifyao.com 读取文件方法体,将方法返回值传给控件即可. 保存文件的四种操作模式 将文件保存到手机的SDcard路

Python获取个人网站的所有课程下载链接和密码,并保存到Mongodb中

1.获取网站课程的分类地址: ''' 爬取屌丝首页,获取每个分类名称和链接 ''' import requests from lxml import etree headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36', } def get_class_data(): list_dat

将UIImage保存到iOS照片库和对应程序沙盒中-b

1.保存到iOS照片库需要引入QuartzCore.framework框架,具体代码如下:.h文件#import <QuartzCore/QuartzCore.h>UIImageView *imageView;@property (nonatomic, retain) IBOutlet UIImageView *imageView;.m文件UIGraphicsBeginImageContext(imageView.bounds.size);[imageView.layer renderInCo

Android开发调试日志工具类[支持保存到SD卡]

直接上代码: package com.example.callstatus; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; import java.net.UnknownHostException; import java.text.SimpleDateFormat; impor

PHP操作:将数据库中的数据保存到Word中。

1.首先定义了一个word类 <?php class word { function start() { ob_start(); ob_start — 打开输出控制缓冲 } function save($path) { $data = ob_get_contents(); ob_get_contents — 返回输出缓冲区的内容 ob_end_clean(); ob_end_clean — 清空(擦除)缓冲区并关闭输出缓冲 $this->wirtetoword($path,$data); }

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

PHP保存session默认的是采用的文件的方式来保存的,这仅仅在文件的空间开销很小的windows上是可以采用的,但是如果我们采用uinx或者是liux上的文件系统的时候,这样的文件系统的文件空间开销是很大的,然而session是要时时刻刻的使用的,大量的用户就要创建很多的session文件,这样对整个的服务器带来性能问题. 另一方面,如果服务器起采用群集的方式的话就不能保持session的一致性,所以我们就绪要采用数据库的方式来保存session,这样,不管有几台服务器同时使用,只要把他们的