`
bluecrystal
  • 浏览: 268267 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

谈谈django中图片上传的2种处理方式

阅读更多

    首先申明该文使用的django 版本为svn 版本,我每天都在更新python 是2.5,pil 也是最新的版本。

    通常情况下用django上传图片我们会定义一个django.forms.Form的子类,比如:

# coding: utf-8

import django.forms as forms

class PictureForm(forms.Form): 
    # ......   
    # 图片
    imagefile = forms.ImageField()
    # ......

     然后我们在服务端会定义一个函数来处理图片上传,我们先来看看一般的做法:

# coding: utf-8

from django.http import HttpResponse

def addPicture(request):
    if request.method == 'POST':
        form = PictureForm(request.POST, request.FILES)
        if form.is_valid():
            f = request.FILES["imagefile"]
            # des_origin_path 为你在服务器上保存原始图片的文件物理路径
            des_origin_f = open(des_origin_path, "ab")
            for chunk in f.chunks():
                des_origin_f.write(chunk)
            des_origin_f.close()
            
            # 图片文件被保存在硬盘上后,你可以用pil的Image.open打开进行处理,比如改变大小,加水印等等

     在上面这种传统的做法中,是把图片文件保存到硬盘上后,再由pil图形库从硬盘上加载,再进行图片处理,明显多了很多的硬盘IO操作,如果你是一个图片处理量很大的应用,显然不想看到这样的局面。那我们来看看另外一个做法:

# coding: utf-8

from django.http import HttpResponse
import ImageFile

def addPicture(request):
    if request.method == 'POST':
        form = PictureForm(request.POST, request.FILES)
        if form.is_valid():
            f = request.FILES["imagefile"]
            parser = ImageFile.Parser()
            for chunk in f.chunks():
                parser.feed(chunk)
            img = parser.close()
            # 在img被保存之前,可以进行图片的各种操作,在各种操作完成后,在进行一次写操作
            img.save("yoursavepath")

     在上面的做法中,我们利用pil的ImageFile直接从django接收的数据流中构建出图形对象,进行处理后,在保存,减少了硬盘的读操作。现在网上有些例子使用StringIO对象来作为pil Image.open的输入,经过我多次尝试,在ubuntu以及winxp、centos上都要报异常,我想可能跟pil的版本有关,或许以前的低版本pil的确可以处理。

 

6
1
分享到:
评论
5 楼 ahuaxuan 2008-09-02  
又试了一下,

pic = StringIO.StringIO()  
 im.save(pic, "PNG")  
 return HttpResponse(pic.getvalue(), mimetype="image/jpg") 



把JPEG改成PNG就可以了
4 楼 ahuaxuan 2008-09-01  
周末在家里试了一下,
pic = StringIO.StringIO()  
 im.save(pic, "JPEG")  
 return HttpResponse(pic.getvalue(), mimetype="image/jpg") 

这种方法不行
3 楼 ahuaxuan 2008-08-28  
哦,明白了,是把pic保存到String流里,刚开始学习django,见笑了,谢谢
2 楼 bluecrystal 2008-08-27  
to ahuaxuan 
参看如下代码:
import StringIO
def execute(request):
    im = Image.open("test.jpg")
    print im
    # im = open('test.jpg', "rb").read()
    font = ImageFont.truetype("arial.ttf", 30)
    draw = ImageDraw.Draw(im)
    mp = md5.new()
    mp_src = mp.update(str(datetime.datetime.now()))
    mp_src = mp.hexdigest()
    rand_str = mp_src[0:6]
    draw.text((10, 5), rand_str, font=font)
    del draw
    #picName = "randomImg/" + request.COOKIES['sessionid'] + ".jpg"
    #im.save(picName)
    pic = StringIO.StringIO()
    im.save(pic, "JPEG")
    return HttpResponse(pic.getvalue(), mimetype="image/jpg")

1 楼 ahuaxuan 2008-08-27  
请教一个问题,用pil生成图片之后我如何直接输出到浏览器:
def execute(request):
    im = Image.open("test.jpg")
    print im
#    im = open('test.jpg', "rb").read()
    font = ImageFont.truetype("arial.ttf", 30)
    draw = ImageDraw.Draw(im)
    mp = md5.new()
    mp_src = mp.update(str(datetime.datetime.now()))
    mp_src = mp.hexdigest()
    rand_str = mp_src[0:6]
    draw.text((10, 5), rand_str, font=font)
    del draw
    picName = "randomImg/" + request.COOKIES['sessionid'] + ".jpg"
    im.save(picName)
    
    return HttpResponse(open(picName, "rb"), mimetype="image/jpg")

其实这是一个验证码的程序,网上的,不过它有个问题,就是图片生成之后要保存到本地再输出,最好的方法是在内存里直接把图片返回,不过im这个对象并不是一个file对象,如何把im直接转成file对象呢

相关推荐

    django将图片上传数据库后在前端显式的方法

    在本例中,需要安装Pillow库,它是一个图像处理库,可以帮助Django处理图像文件。可以通过pip安装: ```bash pip install Pillow ``` 在应用的视图层(views.py)中,需要编写视图函数以处理图片的上传逻辑。例如...

    django layui表单加图片上传功能(Django,layui).zip

    在本文中,我们将深入探讨如何在Django框架中结合Layui实现图片上传功能。Layui是一款优秀的前端UI框架,而Django是Python后端开发的流行框架,两者结合可以构建出美观且功能强大的Web应用。以下是实现这一功能的...

    python django1.0.2批量上传

    Python Django 是一个强大的Web开发框架,它为开发者提供了一种高效、优雅的方式来构建Web应用程序。在本项目"python django1.0.2批量上传"中,重点在于实现文件的批量上传功能,尤其支持中文文件名,这对于处理中文...

    Django 教程中的多个文件上传

    在本教程中,您可以学习 迭代请求文件 和 上传多个文件 一次使用 Django 在 Python 中。本教程旨在为学生和初学者提供学习开发动态网站的参考 姜戈.在这里,我将提供一些步骤来创建一个简单的 Web 应用程序,该应用...

    django实现文件上传并显示的简单例子

    在本文中,我们将深入探讨如何使用Django框架实现文件上传并将其在网页上显示的简单例子。Django是一个流行的Python Web开发框架,以其强大的功能和高效性而受到开发者喜爱。文件上传是Web应用中常见的需求,例如...

    django实现MODELFORM多文件上传范例

    本示例将讲解如何使用ModelForm来实现多文件上传的功能,这对于处理用户上传的多个文件非常有用,比如在上传图片、文档等场景下。 首先,我们需要创建一个Django模型(Model),包含一个或多个FileField或...

    通过Django的form及Ajax等多种方式上传文件

    通过Django的Form方式上传文件,简单,但无法局部刷新实现ajax效果; 通过js或jQuery方式,需要使用FormData对象,仍有些浏览器不兼容; 通过Form+iframe方式上传文件,兼容性最好。 里面含有全部源代码。

    django 返回JSON,图片小例子

    在Python的Web开发框架Django中,返回JSON数据和处理图片是...这个简单的示例只是Django处理JSON和图片能力的一个起点,展示了如何构建一个基本的Web服务。随着学习的深入,你可以构建更复杂、功能更丰富的应用程序。

    Django框架文件上传与自定义图片上传路径、上传文件名操作分析

    本文实例讲述了Django框架文件上传与自定义图片上传路径、上传文件名操作。分享给大家供大家参考,具体如下: 文件上传 1、创建上传文件夹 在static文件夹下创建uploads用于存储接收上传的文件 在settings中配置, ...

    Django Form表单上传文件.zip

    在Django框架中,表单(Form)是处理用户数据的核心工具,特别是在处理文件上传时。本教程将深入探讨如何使用Django Forms来实现文件上传功能。 首先,我们需要了解Django Form的基本结构。在Django中,创建一个...

    django中上传图片分页三级联动效果的实现代码

    在Django中实现图片上传、分页和三级联动效果,主要涉及到以下几个关键点: 1. **上传图片配置**: - 首先,需要在项目目录下创建一个用于存储上传图片的目录,例如`static/media/booktest`。 - 接着,在`...

    django 连接数据库、上传文件

    2. **表单处理**:创建一个Django表单,包含这些字段,以便在视图中处理用户上传的文件。使用`ModelForm`可以简化这个过程: ```python from django import forms from .models import MyModel class MyForm...

    django4中文文档

    Django是最有代表性的一种。许多成功的网站和APP都基于Django。 Django是一个开源的Web应用框架,由Python写成。 Django Web框架还提供高级功能,例如ORM,数据库迁移,用户身份验证,管理面板和表单。 Django程序员...

    django中文官方文档

    django中文文档的介绍,django 官方文档说明 django 官方文档说明 django 官方文档说明

    django 上传文件

    在 Django 框架中,上传文件是一项常见的需求,它涉及到用户通过网页上传图片、文档等各类文件。在这个实例中,我们将深入探讨如何在 Django 1.5 版本中实现一个简单的文件上传功能,特别是图片上传。 首先,我们...

    小程序图片上传至云服务器指定路径后端Django代码

    在开发微信小程序的过程中,将图片上传到云服务器是常见的需求之一。这个场景通常涉及到前端与后端的交互...虽然代码可能比较杂乱,但通过学习和理解,可以提升对Django处理文件上传的理解,为后续的开发工作提供借鉴。

    Django2 文件上传及下载功能(支持中文名文件)python3.7

    在Python的Web开发框架Django中,文件上传和下载是常见的功能需求,尤其在处理用户数据、资源分享或系统备份等方面。本项目基于Django 2.0和Python 3.7,实现了对包括中文名文件在内的文件上传与下载功能。下面将...

    django4.0官方中文文档

    2. **模型(Models)**:Django的核心之一就是ORM(对象关系映射),它允许开发者用Python类来定义数据库表结构。在模型文件中,我们可以定义字段、属性以及字段间的关系,如外键、一对多和多对多等。 3. **视图...

    在django中图片上传的格式校验及大小方法

    综上所述,在Django中实现图片上传的格式校验和大小限制,需要涉及对文件后缀的检查、使用Pillow库打开图片进行格式确认、设置上传文件大小限制、异常处理等多个方面的知识。掌握这些知识点,可以有效地保证网站安全...

    Django 中文文档

    2. 模型层(Model Layer):这部分介绍了Django模型层的架构、字段类型、元选项、模型类查询集、执行查询、查询集方法、查找表达式、实例方法和关联对象的访问。还包括了迁移的概念和步骤。 3. 视图层(View Layer...

Global site tag (gtag.js) - Google Analytics