Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1648638
  • 博文数量: 63
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 646
  • 用 户 组: 普通用户
  • 注册时间: 2015-05-26 18:02
个人简介

祸兮福之所倚,福兮祸之所伏

文章分类

全部博文(63)

文章存档

2020年(11)

2019年(10)

2017年(10)

2016年(25)

2015年(7)

我的朋友

分类: Python/Ruby

2017-03-09 16:09:00

      前端使用django上传文件有两种方式,一种是使用form形式,另一种是使用html实现。
     
     第一种使用form 
       
     url定义    
    url(r'^form',views.form),
    models定义
    定义数据库表

点击(此处)折叠或打开

  1. class Users(models.Model):
  2.     username = models.CharField(max_length=20)
  3.     headimg = models.FileField(upload_to='file') #定义上传的路径,相对于settings中的MEDIA_ROOT路径
  4.     def __str__(self):
  5.         return self.username
定义form表类型

点击(此处)折叠或打开

  1. class UserForm(forms.Form):
  2.     username = forms.CharField()
  3.     headimg = forms.FileField()

     views函数

点击(此处)折叠或打开

  1. def form(request):
  2.     if request.method == 'POST':                       #定义访问的方法,上传一般都使用post方法     
  3.         ul = UserForm(request.POST,request.FILES)      #获取上传的访问数据,使用User_Form 定义获取对象           
  4.         if ul.is_valid():                               # 判断上传信息是否有效  
  5.             username = ul.cleaned_data['username']     #获取数据
  6.             headimg = ul.cleaned_data['headimg']
  7.             user= Users()                              #定义数据库对象 
  8.             user.username = username                   #定义数据库信息   
  9.             user.headimg = headimg
  10.             user.save()                                #保存到数据库 
  11.             return HttpResponse('upload ok')
  12.     else:
  13.         ul = UserForm                                   #定义表单空对象
  14.     return render(request,'login.html',locals())
        
  html页面
       
基于csrf认证的页面(csrf是防跨站请求攻击),函数必须用render返回模板,在表单中添加标签
{% csrf_token %}

点击(此处)折叠或打开

  1. <form method="post" action="/form/" enctype="multipart/form-data">
  2.         {% csrf_token %}
  3.        {{ ul.as_p }}
  4.        <input type="submit" value="upload">
  5.    </form>

访问form路径

上传过后数据库显示

表示已经上传成功



第二种使用html5 实现,models还是使用上面的Users
      
        前端html页面   

点击(此处)折叠或打开

  1. <form action="/uploadfile/" method="post" enctype="multipart/form-data">   #必须定义enctype
  2.        
  3.        <input type="file" name="myfile" >
  4.        <br>
  5.        <input type="submit" value="upload">
  6.    </form>
         

  对应的视图处理函数

点击(此处)折叠或打开

  1. def uploadfile(request):
  2.     if request.method == 'POST':   
  3.         username = request.POST['username']                           #获取username
  4.         myfile = request.FILES.get('myfile',None)                     #获取files二进制流,如果没上传为None
    1.     
  5.         filename = os.path.join(UPLOAD_FILE,myfile.name).replace('\\','/')       #定义上传的文件名(绝对路径),UPLOADFILE为settings中定义的文件上传路径
  6.         if not myfile:                                                        
  7.             HttpResponse('no files for upload'
  8.         dest = open(filename,'wb+')                                    #创建一个文件,使用二进制模式打开,并写入文件流
  9.         try:
  10.             for chunk in myfile.chunks():
  11.                 dest.write(chunk)
  12.         finally:
  13.             dest.close()
  14.         user=Users()                                                   #存储到数据库,img为存储的文件名,使用时,加上上传文件路径即可
  15.         user.username = username
  16.         user.headimg = myfile.name 
  17.         return render_to_response('login.html',{'file':myfile.name })   #上传后返回页面


     myfile的属性:
        myFile.read():从文件中读取整个上传的数据,这个方法只适合小文件

           myFile.chunks():按块返回文件,通过在for循环中进行迭代,可以将大文件按块写入到服务器中;

           myFile.multiple_chunks():这个方法根据myFile的大小,返回True或者False,当myFile文件大于2.5M(默认为2.5M,可以调整)时,该方法返回True,否则返回False,因此可以根据该方法来选择选用read方法读取还是采用chunks方法:

             if myFile.multiple_chunks() == False:

             # 使用myFile.read()

             else:

             # 使用myFile.chunks()

           myFile.name:这是一个属性,不是方法,该属性得到上传的文件名,包括后缀,如123.exe;

          myFile.size:这也是一个属性,该属性得到上传文件的大小。


文件上传就到此。部分转载。


阅读(7280) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~