前端使用django上传文件有两种方式,一种是使用form形式,另一种是使用html实现。
第一种使用form
url定义
url(r'^form',views.form),
models定义
定义数据库表
-
class Users(models.Model):
-
username = models.CharField(max_length=20)
-
headimg = models.FileField(upload_to='file') #定义上传的路径,相对于settings中的MEDIA_ROOT路径
-
-
def __str__(self):
-
return self.username
定义form表类型
-
class UserForm(forms.Form):
-
username = forms.CharField()
-
headimg = forms.FileField()
views函数
-
def form(request):
-
if request.method == 'POST': #定义访问的方法,上传一般都使用post方法
-
ul = UserForm(request.POST,request.FILES) #获取上传的访问数据,使用User_Form 定义获取对象
-
if ul.is_valid(): # 判断上传信息是否有效
-
username = ul.cleaned_data['username'] #获取数据
-
headimg = ul.cleaned_data['headimg']
-
user= Users() #定义数据库对象
-
user.username = username #定义数据库信息
-
user.headimg = headimg
-
user.save() #保存到数据库
-
return HttpResponse('upload ok')
-
else:
-
ul = UserForm #定义表单空对象
-
return render(request,'login.html',locals())
html页面
基于csrf认证的页面(csrf是防跨站请求攻击),函数必须用render返回模板,在表单中添加标签
{% csrf_token %}
-
<form method="post" action="/form/" enctype="multipart/form-data">
-
{% csrf_token %}
-
{{ ul.as_p }}
-
<input type="submit" value="upload">
-
</form>
访问form路径
上传过后数据库显示
表示已经上传成功
第二种使用html5 实现,models还是使用上面的Users
前端html页面
对应的视图处理函数
-
def uploadfile(request):
-
if request.method == 'POST':
-
username = request.POST['username'] #获取username
-
myfile = request.FILES.get('myfile',None) #获取files二进制流,如果没上传为None
-
filename = os.path.join(UPLOAD_FILE,myfile.name).replace('\\','/') #定义上传的文件名(绝对路径),UPLOADFILE为settings中定义的文件上传路径
-
if not myfile:
-
HttpResponse('no files for upload')
-
dest = open(filename,'wb+') #创建一个文件,使用二进制模式打开,并写入文件流
-
try:
-
for chunk in myfile.chunks():
-
dest.write(chunk)
-
finally:
-
dest.close()
-
user=Users() #存储到数据库,img为存储的文件名,使用时,加上上传文件路径即可
-
user.username = username
-
user.headimg = myfile.name
-
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:这也是一个属性,该属性得到上传文件的大小。
文件上传就到此。部分转载。
阅读(7285) | 评论(0) | 转发(0) |