前端使用django上传文件有两种方式,一种是使用form形式,另一种是使用html实现。
第一种使用form
url定义
,
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:这也是一个属性,该属性得到上传文件的大小。
文件上传就到此。部分转载。
阅读(7227) | 评论(0) | 转发(0) |