上次说到处理上传头像的方法是临时保存在本地,其实这样做并不妥,而且修改后的头像重新上传到model中也很麻烦,差了很多资料,解决了这个问题

大致思路:用户上传原图和修改数据—PIL修改后将图片保存为内存中的bytes—使用FTPstorage按规则上传到FTP—修改model中的头像路径数据

一.ContentFile\BytesIO

  1. from PIL import Image
  2. from io import BytesIO
  3. from django.core.files.base import ContentFile
  4.  
  5. def crop_image(file, left, top, right, buttom):
  6. # 打开图片
  7. im = Image.open(file)
  8. # 剪裁图片
  9. crop_im = im.crop((left, top, right, buttom))
  10. # 保存图片
  11. image_io = BytesIO()
  12. crop_im.save(fp=image_io, format='JPEG')
  13. return ContentFile(image_io.getvalue())

这里简单的写了一个修改图片的方法,因为后面要将图片上传到FTP,所以需要用之前实现的FTPstorage,经过查阅官方文档,发现storage的save操作的对象content只能是django.core.files.base里的File类以及它的子类,所以这里需要自己生成一个新的File:ContentFile,参数就是BytesIO类的的getvalue()方法,可以得到一个bytes

二.FTPstorage

  1. def headpic_to_ftp(path, content):
  2. storage = FTPStorage()
  3. if storage.exists(path):
  4. storage.delete(path)
  5. storage.save(path, content)
  6. else:
  7. storage.save(path, content)

这里简单的写了一个上传的方法,path是路径和文件名,可以根据自己的需求在view中写逻辑

三.view

  1. def user_my_info_headpic(request):
  2. # 剪裁数据获取
  3. username = request.user
  4. headpic_name = headpic_path+'/'+str(username)+'.jpg'
  5. file = request.FILES['avatar_file']
  6. top = int(float(request.POST['avatar_y']))
  7. buttom = top + int(float(request.POST['avatar_height']))
  8. left = int(float(request.POST['avatar_x']))
  9. right = left + int(float(request.POST['avatar_width']))
  10. # 剪裁头像
  11. crop_file = crop_image(file, left, top, right, buttom)
  12. # 上传头像
  13. headpic_to_ftp(headpic_name, crop_file)
  14. # 修改头像信息
  15. userinfo = UserInfo.objects.get(username=username)
  16. userinfo.headpic=headpic_name
  17. userinfo.save()
  18. return HttpResponse("success")

cropper+pillow处理上传图片剪裁(二)的更多相关文章

  1. cropper+pillow处理上传图片剪裁(一)

    在写新博客的时候,遇到需要用户上传自定义图片的处理,查了一番资料,决定用cropper和pillow来处理需要剪裁的图片上传,大致思路是:前端收集用户上传的图片和用户剪裁的尺寸数据,后台接收图片后按数 ...

  2. 基于layui+cropper.js实现上传图片的裁剪功能

    最近因项目需求,需要在上传图片的时候先对图片裁剪,然后在上传,所以就有了本文的出现. 开始正文之前,要提一下这个图片的裁剪:图片的裁剪,有前端裁剪,也可以后端裁剪 前端的裁剪我知道的可以分为这么两种: ...

  3. 图片剪裁上传插件 - cropper

    图片剪裁上传插件 - cropper <style> .photo-container{float: left;width: 300px;height: 300px;} .photo-co ...

  4. 插件介绍 :cropper是一款使用简单且功能强大的图片剪裁jQuery插件。

    简要教程 cropper是一款使用简单且功能强大的图片剪裁jQuery插件.该图片剪裁插件支持图片放大缩小,支持鼠标滚轮操作,支持图片旋转,支持触摸屏设备,支持canvas,并且支持跨浏览器使用. c ...

  5. CSS3之背景剪裁Background-clip

    CSS3之背景剪裁Background-clip是CSS3中新添加的内容.这个属性还是比较简单的,主要分五个属性值:border.padding.content.no-clip和text.下面将针对这 ...

  6. h5端呼起摄像头扫描二维码并解析

    2016年6月29日补充: 最近做了一些与表单相关的项目,使用了h5的input控件,在使用过程中遇到了很多的坑.也包括与这篇文章相关的. 首先我们应该知道使用h5新提供的属性getUserMedia ...

  7. MongoDB GridFS 对图片进行增删改

    using MongoDB.Bson; using MongoDB.Driver; using MongoDB.Driver.Builders; using MongoDB.Driver.GridFS ...

  8. iOS开发——高级篇——Parse 教程:网络后台基础

    本教程已针对Swift, iOS 8.3, Xcode 6.3及最新的Parse SDK(1.7.1版本)更新. 网络后台支持可以为你的App添加许多崭新的功能:不论是数据同步,社交分享,还是云端存储 ...

  9. XMPP框架下微信项目总结(8)图片发送

    前言:“图片”发送和“聊天文本”都是通过模块发起的成为:“消息模块”(反正传递的都是字符串) 发送原理:     1 current客户端获取本地图片 2 xmpp发送“字符串”(为什么是字符串?1: ...

随机推荐

  1. EF test

    LibraryEntities db = new LibraryEntities(); private void btnSelect_Click(object sender, EventArgs e) ...

  2. webpack核心提炼

    基本是学习的时候在网上整理的资料,并非自己原创,这篇文章的的主要目的是记录webpack.config.js的配置方式.可能也有不少错误,欢迎指正!! 一.应用场景 前端模块化开发.功能拓展.css预 ...

  3. 【转载】IDEA的这八条配置你一定要改!

    引言 坦白说,我很少写这种操作类型的文章.因为这种文章没啥新意,大家操作步骤肯定是一样的.然而,我答应了我的同事小阳,给她出一篇!毕竟人家打算从Eclipse转IDEA了,于是以示鼓励,写一篇给她!那 ...

  4. res对象json,redirect

    1.res.json() var express=require('express'); var app=express(); app.get('/',function(req,res){ //返回j ...

  5. PKU 1019 Number Sequence(模拟,思维)

    题目 以下思路参考自discuss:http://poj.org/showmessage?message_id=176353 /*我的思路: 1.将长串数分成一个个部分,每个部分是从1到x的无重复的数 ...

  6. Hzoi 2018.2.11多边形 区间DP

    给定一个由N个顶点构成的多边形,每个顶点被赋予一个整数值,而每条边则被赋予一个符号:+(加法运算)或者*(乘法运算),所有边依次用整数1到N标识. 一个多边形的图形表示 首次移动,允许将某条边删除: ...

  7. phpqrcode生成二维码

    这篇文章讲解得非常详细: https://www.jb51.net/article/136418.htm 备注一下: 如果遇到生成的二维码是一串乱码.只需要在代码最后加上 exit();即可解决,原理 ...

  8. HDU 1241 Oil Deposits (DFS or BFS)

    链接 : Here! 思路 : 搜索判断连通块个数, 所以 $DFS$ 或则 $BFS$ 都行喽...., 首先记录一下整个地图中所有$Oil$的个数, 然后遍历整个地图, 从油田开始搜索它所能连通多 ...

  9. 10.使用Mybatis-Generator自动生成Dao、Model、Mapping相关文件(转)

    出处:http://www.cnblogs.com/lichenwei/p/4145696.html Mybatis属于半自动ORM,在使用这个框架中,工作量最大的就是书写Mapping的映射文件,由 ...

  10. VIM 使用 匹配替换命令配合表达式 实现 递增替换

    :let n=100 | g/while/s/\d/\=n / | let n=n+1 before 10 void *thread_function_1(void *arg) { 11 int i; ...