django的图片上传(处理图片大小,图片如果如果存在就改变文件名)

来源:互联网 发布:淘宝模特兼职靠谱吗 编辑:程序博客网 时间:2024/06/05 17:48

 

django的图片上传(处理图片大小,图片如果如果存在)

 

PIL的文档Image模块第二个例子就是讲生成缩略图的。image.thumbnail就可以了。参考:http://www.pythonware.com/library/pil/handbook/image.htm

views.py
from PIL import Image
#这个没有设置forms.py
def upload(request):      
    reqfile = request.FILES['photo'] #request.FILES['file'](file是你上传输入框的名称)就是一个文件 
    image = Image.open(reqfile)  
    image.thumbnail((128,128),Image.ANTIALIAS)                                                                               image.save("c:/photo/1.jpeg","jpeg") #这里是将图片都将会以1.jpeg名字保存 
    return HttpResponse("success.")  
前台是
<form action="/upload/" method="post" enctype="multipart/form-data">
<fieldset>
<legend>上传文件</legend>
<input type="file" name="photo" />
<input type="submit" value="上传"/>
</fieldset>
</form>
但是这个方发将所有的图片保存一个名字。而且传下个图片会覆盖原来的图片 所以需要改文件名:以下是我的项目的code:
views/py
import os
import random
from juxin.app.models import Info
from PIL import Image
           
            if 'file' in request.FILES:  #这里是重点!为什么我要判断file呢?因为如果你想不传文件(也就是这个字段为空),但是还是要传其他的字段(如:我只想传标题,而图片我不传),  那么必 须要判断下。不然会报错"Key 'file' not found in <MultiValueDict: {}>"
               image = request.FILES["file"]
               img= Image.open(image)
               img.thumbnail((250,250),Image.ANTIALIAS)
               
               url='photos/'+image.name  #1:这里是在我media_root下的子目录photos加上上传的文件名,当然我的models种的字段类型是这样设置的:image= models.ImageField(upload_to='photos/' ,blank=True,null=True),这就是将文件保存到photos下的设置
#2:而且url也是用来保存到数据库的路径,而不是下边的name
#3:为什么是'photos/'而不是'/photos/',要保存到数据库的文件名地址是photos/photo.jpeg,不是/photo/photo.jpeg,也不是c:/juxin/stylesheets/photos/photo.jpeg  **c:/juxin/stylesheets是我settings.MEDIA_ROOT的值
               name=settings.MEDIA_ROOT+'/'+url  #这个是文件保存的目录跟文件名,然后判断文件名是否存在
               if os.path.exists(name): #这个os方法是判断文件目录下的文件名是否存在  
                    file, ext = os.path.splitext(image.name) #这个方法是将每个文件名分割为名字跟扩展名,eg: s,t=os.path.splitext('name.py')  s='name' ,t='.py'
                    file=file+str(random.randint(1,1000)) #这个是将文件名进行修改
                    image.name=file+ext  #返回新文件名
                    url='photos/'+image.name
                    name=settings.MEDIA_ROOT+'/'+url #这里要加'/',不然路径是错误的
               img.save(name,"jpeg")  #以我原文件名或者修改过的文件名的完整url保存
            else:
               image=None

           m=Info(....,image=url)  #Info是我数据库的表名,这样就将url保存到image字段里了
完整代码:
def infos(request): 
    if request.method == 'POST': 
        form = xinxi(request.POST, request.FILES) 
        if form.is_valid(): 
            title = form.cleaned_data['title'] 
            categoryid = int(form.cleaned_data['category'])
            category=Category.objects.get(id=categoryid)
            subcategoryid =int(form.cleaned_data['subcategory'])
            subcategory=Subcategory.objects.get(id=subcategoryid)
            price = form.cleaned_data['price']
            schoolid = form.cleaned_data['school']
            if schoolid=='':
               school=None
            else:
         school=School.objects.get(id=int(schoolid))
            phone = form.cleaned_data['phone']
            address=form.cleaned_data['address']
           
            content = form.cleaned_data['content']
            content =content.replace("/n","<br>") 
            
            
            if 'file' in request.FILES:
               image = request.FILES["file"]
               img= Image.open(image)
               img.thumbnail((250,250),Image.ANTIALIAS)
               
               url='photos/'+image.name
               name=settings.MEDIA_ROOT+'/'+url
               if os.path.exists(name):   
                    file, ext = os.path.splitext(image.name)
                    file=file+str(random.randint(1,1000))
                    image.name=file+ext
                    url='photos/'+image.name
                    name=settings.MEDIA_ROOT+'/'+url
               img.save(name,"jpeg")  
            else:
               image=None
           
            m=Info(title=title,category=category,subcategory=subcategory,
               price=price,school=school,phone=phone,address=address,content=content,image=url)
            m.save() 
            url = "/sub/"+str(subcategoryid)
            return HttpResponseRedirect(url) 
    else: 
        form = xinxi() 
    messages = Info.objects.all()
    
    categorys = Category.objects.all()
    schools = School.objects.all()
    info=Info.objects.all()
    template_values = {
'categorys':categorys,
'schools':schools
}
    t = get_template('infoForm.html')
    html = t.render(Context({'cate': template_values}))
    
    return HttpResponse(html)
简单方法是

django的文件 图片上传

一直以为django的文件跟图片上传问题很麻烦,在网上找了好久,找了很多麻烦的方法 但是效果还不好,今天在无意中突然发现其实很简单,简单的要死! 晕!

 

以前我是这样写views的:     (这是在有forms.py的情况下 )

from PIL import Image

from juxin import settings

 

            f = request.FILES["file"]  (如果是直接上传的话<没有forms.py>用request.FILES.get['file'])

            parser = ImageFile.Parser()  

            for chunk in f.chunks():

                parser.feed(chunk)  

            img = parser.close()

            name = '%s%s' % (settings.MEDIA_ROOT, f.name)  ##这里的时保存文件的路径加名字!

            img.save(name) 

  这种方法可以将图片保存到你想要的位置,也可以是文件!但是怎么在templates上显示上传的图片就是个麻烦问题,要重新设置MEDIA_ROOT,跟STATIC_ROOT,所以不推荐使用!

 

下面介绍最简单的方法!!!

 

那就是!!!:::

1:当然要先设置models.py 

image= models.ImageField(upload_to='photos/%Y/%m/%d', blank=True,null=True)

                                这里的upload_to是必须的参数,他会把上传的文件保存到MEDIA_root +upload_to后便的路径,

 

2:然后设置跟form.py

   image = forms.ImageField(required=False)  

3:前台的是这样的post数据

 

<form action="/upload/" method="post" enctype="multipart/form-data">这个是一定要有的,如果你还要上传文字或者其他的东西,在form中间加就行了,比喻<legend>标题</legend>  <input type="text" name="title" id="title">

<form>

<fieldset>

<legend>上传文件</legend>

<input type="file" name="docfile" />

<input type="submit" value="上传"/>

</fieldset>

</form>

 

 

 

4:再就是views.py了,要先导入forms中的类!

 

           if 'file' in request.FILES:  这里是重点!为什么我要判断file呢?因为如果你想不传文件(也就是字段为空),但是还是要传其他的字段(如:我只想传标题,而图片我不传),  那么必 须要判断下。不然会报错"Key 'file' not found in <MultiValueDict: {}>"

                image = request.FILES["file"]

            else:

                image=None

然后把得到的图片保存到数据库,django保存的知识图片或者文件的url,图片保存在本地计算机上,这样提高django运行效率,s=Info(image=image)

            s.save()

 

5:  最后一步就是让图片在templates中显示了!!!!

 

{% if info.image %}<img src='{{ info.image.url }}' />{% endif %}

   在django book里说得到图片的绝对路径是这样的:{{ info.get_image_url }},这个是错误的!!这个是0.9版本的用法!

 

 

当然 这里也要做下判断,如果image为null的话,他就不显示,注意: 这里判断的不是{% if info.image.url %}!

 

原创粉丝点击